动态抓取的实例

在开始爬虫之前,我们需要了解一下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. 【LeetCode】576. Out of Boundary Paths 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 状态搜索 记忆化搜索 相似题目 参考资料 ...

  2. C. Success Rate

    Success Rate 题目链接 题意 给你两个分数形式的数,然后有两种变化方式 上下都+1 仅下面部分+1 让你求第一个分数变化到第二个分数的最小步数. 思路 有几种特殊情况分类讨论一下. 首先我 ...

  3. 【LeetCode】306. Additive Number 解题报告(Python)

    [LeetCode]306. Additive Number 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http: ...

  4. computer(hdu2196)

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  5. CapstoneCS5212替代IT6516方案|DP转VGA芯片|替代兼容IT6516

    台湾联阳IT6516是一种高性能的DP显示端口到VGA转换器方案芯片.IT6516结合DisplayPort接收器和三重DAC,通过转换功能支持DisplayPort输入和VGA输出.内置Displa ...

  6. mt19937

    额,这个是一个小记.没什么,就是记给自己看的,你可以走了. mt19937 需要 C++11.生成高质量随机数. mt19937 rnd(chrono::system_clock::now().tim ...

  7. VoIP语音处理流程和知识点梳理

    做音频软件开发10+年,包括语音通信.语音识别.音乐播放等,大部分时间在做语音通信.做语音通信中又大部分时间在做VoIP语音处理.语音通信是全双工的,既要把自己的语音发送出去让对方听到,又要接收对方的 ...

  8. hisql 新功能 支持一套sql在不同数据库执行

    目前流行的ORM框架如果需要动态的拼接查询语句,只能用原生的sql进行拼接,无法跨不同数据库执行.hisql推出新的语法一套语句可以在不同的数据库执行 传统ORM框架最大的弊端就是完全要依赖于实体用l ...

  9. Unity3D开发入门教程(二)—— Lua入门

    五邑隐侠,本名关健昌,12年游戏生涯. 本教程以 Unity 3D + VS Code + C# + tolua 为例. 如果你还没有编程基础,建议你先学习一些编程基础.本文不是完全菜鸟教程,主要针对 ...

  10. 初识python 之 mysql数据库基本操作

    import pymysql 注:所有插入.修改.删除操作都必须要提交(conn.commit()) 连接数据库: conn = pymysql.connect( host = '127.0.0.1' ...