python网络爬虫-动态网页抓取(五)
动态抓取的实例
在开始爬虫之前,我们需要了解一下Ajax(异步请求)。它的价值在于在与后台进行少量的数据交换就可以使网页实现异步更新。
如果使用Ajax加载的动态网页抓取,有两种方法:
- 通过浏览器审查元素解析地址。
- 通过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网络爬虫-动态网页抓取(五)的更多相关文章
- python网络爬虫-静态网页抓取(四)
静态网页抓取 在网站设计中,纯HTML格式的网页通常被称之为静态网页,在网络爬虫中静态网页的数据比较容易抓取,因为说有的数据都呈现在网页的HTML代码中.相对而言使用Ajax动态加载的玩个的数据不一定 ...
- Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过Selenium模拟浏览器抓取
区别于上篇动态网页抓取,这里介绍另一种方法,即使用浏览器渲染引擎.直接用浏览器在显示网页时解析 HTML.应用 CSS 样式并执行 JavaScript 的语句. 这个方法在爬虫过程中会打开一个浏览器 ...
- python3.4学习笔记(十七) 网络爬虫使用Beautifulsoup4抓取内容
python3.4学习笔记(十七) 网络爬虫使用Beautifulsoup4抓取内容 Beautiful Soup 是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖 ...
- PHP网络爬虫实践:抓取百度搜索结果,并分析数据结构
百度的搜索引擎有反爬虫机制,我先直接用guzzle试试水.代码如下: <?php /** * Created by Benjiemin * Date: 2020/3/5 * Time: 14:5 ...
- Python网络爬虫与如何爬取段子的项目实例
一.网络爬虫 Python爬虫开发工程师,从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页 ...
- 爬虫 - 动态分页抓取 游民星空 的资讯 - bs4
# coding=utf-8 # !/usr/bin/env python ''' author: dangxusheng desc : 动态分页抓取 游民星空 的资讯 date : 2018-08- ...
- Python实现简单的网页抓取
现在开源的网页抓取程序有很多,各种语言应有尽有. 这里分享一下Python从零开始的网页抓取过程 第一步:安装Python 点击下载适合的版本https://www.python.org/ 我这里选择 ...
- Python 网络爬虫 002 (入门) 爬取一个网站之前,要了解的知识
网站站点的背景调研 1. 检查 robots.txt 网站都会定义robots.txt 文件,这个文件就是给 网络爬虫 来了解爬取该网站时存在哪些限制.当然了,这个限制仅仅只是一个建议,你可以遵守,也 ...
- 面向初学者的Python爬虫程序教程之动态网页抓取
目的是对所有注释进行爬网. 下面列出了已爬网链接.如果您使用AJAX加载动态网页,则有两种方式对其进行爬网. 分别介绍了两种方法:(如果对代码有任何疑问,请提出改进建议)解析真实地址爬网示例是参考链接 ...
随机推荐
- 【LeetCode】1128. Number of Equivalent Domino Pairs 等价多米诺骨牌对的数量(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典统计 代码 复杂度分析 日期 题目地址:http ...
- 1142 - Summing up Powers (II)
1142 - Summing up Powers (II) PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit ...
- 突破技术限制,实现Web端静默打印
作为Web开发的同僚们,估计都有一个共同的烦恼,Web端为什么不能够像 CS端那样直接打印预览?直接移除掉打印预览界面不就可以了? 真实情况是Web端受限于浏览器的权限,无法直接访问打印机等本机资源. ...
- HDU 4790:Just Random(容斥)
Just Random Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- 编写Java程序,实现控制台版的省市联动
返回本章节 返回作业目录 需求说明: 系统显示用户所有直辖市的名称,用户在控制台输入直辖市的名称,即可在控制台中显示该直辖市所管辖的所有区的名称. 实现思路: 创建省市联动类ProvincialLin ...
- C#WPF数据绑定模板化操作四步走
前言:WPF数据绑定对于WPF应用程序来说尤为重要,本文将讲述使用MVVM模式进行数据绑定的四步走用法: 具体实例代码如下: 以下代码仅供参考,如有问题请在评论区留言,谢谢 1 第一步:声明一个类用来 ...
- CAS学习笔记二:CAS单点登录流程
背景 由于公司项目甲方众多,各甲方为了统一登录用户体系实现单点登录(SSO)开始要求各乙方项目对接其搭建的CAS单点登录服务,有段时间对CAS的流程很迷,各厂商还有基于CAS进行二次开发的情况,所以对 ...
- Swoole 中使用 Lock 实现进程间锁
注意:不要在 lock 和 unlock 操作中间使用可能引起协程切换的 API. $lock = new Swoole\Lock(SWOOLE_MUTEX); echo "[Master] ...
- PHP 中的闭包函数和匿名函数
闭包函数 闭包函数通常作为函数中的函数使用. <?php $foo = function($s) { echo $s; }; $foo('hello'); <?php function t ...
- 【白话科普】10s 从零看懂 H5
最近大家有没有发现,很多微信公众号的动态内容变多了?我们常常可以看到,公众号内容中有很多动态图片甚至动画,还可以通过手指滑动切换页面,或者有一些小的点击互动. 这种看起来有点高级的小作品,其实是都是& ...