动态抓取的实例

在开始爬虫之前,我们需要了解一下Ajax(异步请求)。它的价值在于在与后台进行少量的数据交换就可以使网页实现异步更新。

如果使用Ajax加载的动态网页抓取,有两种方法:

  1. 通过浏览器审查元素解析地址。
  2. 通过Selenium模拟浏览器抓取。

解析真实地址抓取

# 请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10、.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'
}
for e in range(1, 11):
# 要请求的数据地址
link = """
https://api-zero.livere.com/v1/comments/list?callback=jQuery112400364209957301318_1640670329077&limit=10&offset=""" + str(
e) + """&repSeq=4272904&requestPath=%2Fv1%2Fcomments%2Flist&consumerSeq=1020&livereSeq=28583&smartloginSeq=5154&code=&_=1640670329079
"""
# 加入请求头,发送请求
r = requests.get(link, headers=headers)
# 请求响应的内容
json_string = r.text
# 找到响应内容中的字符格式JSON数据
json_string = json_string[json_string.find('{'):-2]
# 把字符格式的响应数据转化为json数据
json_data = json.loads(json_string)
comment_list = json_data['results']['parents']
i = 0
for eachone in comment_list:
message = eachone['content']
i += 1
print(i)
print(message)

通过selenium模拟浏览器抓取:使用浏览器渲染的方式将爬取的动态网页变成静态网页

selenium安装

pip install selenium

fp = webdriver.FirefoxOptions()

fp.set_preference("permissions.default.stylesheet", 2)

# 打开浏览器

# driver = webdriver.Firefox(firefox_profile=fp, executable_path=r'C:\Program Files\Mozilla Firefox\firefox.exe')

driver = webdriver.Firefox(options=fp)

# 输入打开网址

driver.get("http://www.santostang.com/2018/07/04/hello-world/")

需要下载一个浏览器驱动器

下载chromedriver地址:http://chromedriver.storage.googleapis.com/index.html

下载geckodriver地址:https://github.com/mozilla/geckodriver/releases

selenium获取文章的所有评论

from selenium import webdriver  # 模拟浏览器抓取
fp = webdriver.FirefoxOptions()
fp = webdriver.ChromeOptions()
# fp.set_preference("permissions.default.stylesheet", 2)
fp.set_capability("permissions.default.stylesheet", 2)
# 打开浏览器
# driver = webdriver.Firefox(firefox_profile=fp, executable_path=r'C:\Program Files\Mozilla Firefox\firefox.exe')
# driver = webdriver.Firefox(options=fp)
driver = webdriver.Chrome(options=fp)
# 输入打开网址
driver.get("http://www.santostang.com/2018/07/04/hello-world/")
# # 切换到ifrom
# driver.switch_to.frame(driver.find_element_by_css_selector("iframe[title='livere-comment']"))
# # 通过class选择器的方式查找
# comment = driver.find_element_by_css_selector('div.reply-content')
# # 通过标签选择器查找
# content = comment.find_element_by_tag_name('p')
# selenium选择元素的方法
# find_element_by_id:通过元素的id选择,例如:driver.find_element_by_id(‘loginForm’)
# find_element_by_name:通过元素的name选择,driver.find_element_by_name(‘password’)
# find_element_by_xpath:通过xpath选择,driver.find_element_by_xpath(“ // form[1]”)
# find_element_by_link_text:通过链接地址选择
# find_element_by_partial_link_text:通过链接的部分地址选择
# find_element_by_tag_name:通过元素的名称选择
# find_element_by_class_name:通过元素的class选择
# find_element_by_css_selector:通过css选择器选择
# 需要查找多个元素,就是在上述的element后加上s,变成elements。xpath和css_selector是比较好的方法
# 常见的操作元素方法
# clear 清除元素的内容
# – send_keys 模拟按键输入
# – click 点击元素
# – submit 提交表单 # 执行JS脚本 滑倒底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
driver.switch_to.frame(driver.find_element_by_css_selector("iframe[title='livere-comment']"))
time.sleep(1)
for i in range(0, 3):
load_more = driver.find_element_by_css_selector('button.page-last-btn')
load_more.click()
# driver.switch_to.default_content()
time.sleep(1)
# driver.switch_to.frame(driver.find_element_by_css_selector("iframe[title='livere-comment']"))
comments = driver.find_elements_by_css_selector('div.reply-content')
for cm in comments:
content = cm.find_element_by_tag_name('p')
print(content.text)

selenium优化操作

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
import random options = Options()
num = str(float(random.randint(500, 600)))
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/{}"
" (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/{}".format(num, num))
# 禁止图片和css加载
prefs = {"profile.managed_default_content_settings.images": 2, 'permissions.default.stylesheet': 2}
options.add_experimental_option("prefs", prefs) driver = webdriver.Chrome(executable_path='E:\\DownLoad\\python\\Scripts\\chromedriver.exe', chrome_options=options)
driver.get('https://www.ly.com/')
time.sleep(5)
html = driver.find_element_by_xpath("//body").get_attribute("innerHTML")
print(html)

selenium爬虫时间:深圳短租数据

option = webdriver.FirefoxOptions()
option.set_preference('permissions.default.image', 2)
option.set_preference('permissions.default.stylesheet', 2)
firefox = webdriver.Firefox(options=option)
firefox.set_page_load_timeout(5)
firefox.set_script_timeout(5)
try:
firefox.get(
"https://www.airbnb.cn/s/%E9%9D%92%E5%B2%9B/homes?host_promotion_type_ids[]=0&host_promotion_type_ids[]=1&host_promotion_type_ids[]=8&checkin=2021-12-30&checkout=2021-12-31")
divs = firefox.find_elements_by_css_selector("div._8ssblpx")
for div in divs:
# 价格 评价数 名称 房屋种类 床数量 房客数量
str_fangwu = div.find_element_by_css_selector("span._faldii7")
str_fangwu = str_fangwu.text
jg = div.find_element_by_css_selector("span._185kh56")
jg = jg.text
pjs = div.find_element_by_css_selector("span._1clmxfj")
pjs = pjs.text
name = div.find_element_by_css_selector("div._qrfr9x5")
name = name.text
print(str_fangwu, jg, pjs, name)
except Exception as e:
pass

python网络爬虫-动态网页抓取(五)的更多相关文章

  1. python网络爬虫-静态网页抓取(四)

    静态网页抓取 在网站设计中,纯HTML格式的网页通常被称之为静态网页,在网络爬虫中静态网页的数据比较容易抓取,因为说有的数据都呈现在网页的HTML代码中.相对而言使用Ajax动态加载的玩个的数据不一定 ...

  2. Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过Selenium模拟浏览器抓取

    区别于上篇动态网页抓取,这里介绍另一种方法,即使用浏览器渲染引擎.直接用浏览器在显示网页时解析 HTML.应用 CSS 样式并执行 JavaScript 的语句. 这个方法在爬虫过程中会打开一个浏览器 ...

  3. python3.4学习笔记(十七) 网络爬虫使用Beautifulsoup4抓取内容

    python3.4学习笔记(十七) 网络爬虫使用Beautifulsoup4抓取内容 Beautiful Soup 是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖 ...

  4. PHP网络爬虫实践:抓取百度搜索结果,并分析数据结构

    百度的搜索引擎有反爬虫机制,我先直接用guzzle试试水.代码如下: <?php /** * Created by Benjiemin * Date: 2020/3/5 * Time: 14:5 ...

  5. Python网络爬虫与如何爬取段子的项目实例

    一.网络爬虫 Python爬虫开发工程师,从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页 ...

  6. 爬虫 - 动态分页抓取 游民星空 的资讯 - bs4

    # coding=utf-8 # !/usr/bin/env python ''' author: dangxusheng desc : 动态分页抓取 游民星空 的资讯 date : 2018-08- ...

  7. Python实现简单的网页抓取

    现在开源的网页抓取程序有很多,各种语言应有尽有. 这里分享一下Python从零开始的网页抓取过程 第一步:安装Python 点击下载适合的版本https://www.python.org/ 我这里选择 ...

  8. Python 网络爬虫 002 (入门) 爬取一个网站之前,要了解的知识

    网站站点的背景调研 1. 检查 robots.txt 网站都会定义robots.txt 文件,这个文件就是给 网络爬虫 来了解爬取该网站时存在哪些限制.当然了,这个限制仅仅只是一个建议,你可以遵守,也 ...

  9. 面向初学者的Python爬虫程序教程之动态网页抓取

    目的是对所有注释进行爬网. 下面列出了已爬网链接.如果您使用AJAX加载动态网页,则有两种方式对其进行爬网. 分别介绍了两种方法:(如果对代码有任何疑问,请提出改进建议)解析真实地址爬网示例是参考链接 ...

随机推荐

  1. Java程序设计基础作业目录(作业笔记)

    持续更新中............. Java程序设计基础笔记 • [目录] 我的大学笔记>>> 第1章 初识Java>>> 1.1.4 学生成绩等级流程图练习 1 ...

  2. 编写Java程序,模拟教练员和运动员出国比赛场景,其中运动员包括乒乓球运动员和篮球运动员。教练员包括乒乓球教练和篮球教练。为了方便出国交流,根乒乓球相关的人员都需要学习英语。

    需求说明: 模拟教练员和运动员出国比赛场景,其中运动员包括乒乓球运动员和篮球运动员.教练员包括乒乓球教练和篮球教练.为了方便出国交流,根乒乓球相关的人员都需要学习英语.具体分析如下: (1)共同的属性 ...

  3. Swoole 中使用 UDP 异步服务器、UDP 同步客户端、UDP 协程客户端

    UDP 异步风格服务器 # udp_server.php // 创建 UDP 服务器对象,监听0.0.0.0:9502端口,类型为SWOOLE_SOCK_UDP $serv = new Swoole\ ...

  4. [Blue Prism] Data item 的使用

      1.用于存储各种数据类型的变量,支持的数据类型如下: Binary - 用于存储二进制 blob,例如文本文件. Date - 用于存储日期. 此数据类型与 DateTime 类似,只是 Date ...

  5. DRF框架在嵌套关系下实现嵌套对象字段的过滤

    当需要对关联对象的字段进行选择性显示时,在所对应的serializer类中声明引用的字段. 例如: class TrackSerializer(serializers.ModelSerializer) ...

  6. Linux shc 命令手册

    shc Generic shell script compiler. https://www.linux-man.cn/command/shc/ #Compile a shell script: sh ...

  7. Golang实现集合(set)

    package set package set import ( "bytes" "fmt" "sync" ) type Set struc ...

  8. iframe 去除边框 背景透明等设置 待修改

    <iframe name="file_frame" src="UploadFile.jsp" frameborder=no  border=0  marg ...

  9. Git 的基本命令的使用

    1.获得Git仓库(克隆一份代码到本地仓库) git clone url 2.更新本地的代码 git pull 3.查看本地修改的文件 git status 4.将本地的修改加到stage中 git ...

  10. Centos下安装Maven私服Nexus

    dockers安装Nexus,指定访问路径(默认为/:在使用Nginx做反向代理时,最好指定访问路径),并在容器外持久化数据,避免Nexus容器升级后数据丢失. 安装并启动 docker run -d ...