scrapy配合selenium爬取需要反复操作同一个动态页面的方法,解决点击“下一页”但是URL相同的网站
首先这种网站一定要设置爬取的速率,目标网站用这种方式写入网页估计是被爬虫搞怕了,大概率有更简单的反爬方法,因此爬取速率要注意。博主要爬的网站是一个电影网站:艺恩,点击下一页可以看到其实执行了一个js拿数据,但是URL却没有任何变化,我们需要一路下一页下一页点下去,然后把展示出的电影详情也搞到。
爬取思路:
- 启动selenium,控制Chrome开两个标签页,第一个标签页显示主页,第二个标签页显示不同的电影详情页
- 如果是需要点击下一步的,就先跳转到第一个tab,然后点击“下一步”,把网页信息传回去。
- 如果要显示电影详情页,就跳转到第二个tab,然后把网页信息传回去。
代码:
- 首先是爬虫文件spider的编写
# -*- coding: gbk -*-
from scrapy.spiders import CrawlSpider
import scrapy
from urllib.parse import urljoinclass MovieDetailSpider(CrawlSpider):name = "flim"allowed_domains = ["endata.com.cn"]def start_requests(self):start_url = 'https://www.endata.com.cn/BoxOffice/MovieStock/movies.html'self.page = 1 # 当前主页的页面self.max_page = 500 # 预期爬取的最大页面,这个可以往大调整,目的是及时退出循环。yield scrapy.Request(start_url, self.parse, dont_filter=True, meta={'page': self.page,})def parse(self, response):# 这里是拿到详情页后的函数# 1. 提取出这个页面中出现的电影,然后传给movie_detail_page方法提取电影详情页的内容li_movie_list = response.css('ul.movies-list-box li')for li_movie_info in li_movie_list[:2]:relative_url = li_movie_info.css('a::attr(href)').extract_first()relative_url = relative_url.strip()movie_url = urljoin(response.url, relative_url)yield scrapy.Request(movie_url, callback=self.movie_detail_page,dont_filter=False) # when you run, turn to True# 重要!这是个 死循环/递归 操作,把详情页的URL继续发送给middleware,回调自己,以方便再次从页面中提取电影列表start_url = 'https://www.endata.com.cn/BoxOffice/MovieStock/movies.html'self.page += 1if self.page < self.max_page:yield scrapy.Request(start_url, self.parse, dont_filter=True, meta={'page': self.page,})# next page begindef movie_detail_page(self, response):movie_dict = {}# 这是个提取电影详情页的函数,提取出来内容yield给pipeline保存就行yield movie_dict
- middleware 文件:
class HandlessMiddleware(object):def __init__(self):# 在构造方法里创建Chrome窗口与两个标签页super(HandlessMiddleware, self).__init__()option = webdriver.ChromeOptions()option.add_argument('headless')prefs = {"profile.managed_default_content_settings.images": 2, # 禁止加载图片'permissions.default.stylesheet': 2, # 禁止加载css}option.add_experimental_option("prefs", prefs)self.browser = webdriver.Chrome(chrome_options=option)self.browser.implicitly_wait(5)self.browser.execute_script('window.open("","_blank");') # 新建一个标签页# 每个URL都会被送到这里,所以要根据不同的url判断# 1. 定位到哪一个标签页# 2. 是抓取传来的URL还是点击下一页def process_request(self, request, spider):# 如果是首页url,意味着要点击“下一页”if request.url == 'https://www.endata.com.cn/BoxOffice/MovieStock/movies.html':# 如果是第一次爬取,那么需要把首页抓下来if request.meta['page'] == 1:self.browser.switch_to.window(self.browser.window_handles[0])self.browser.get(request.url)self.max_page = int(self.browser.find_element_by_id('TableList_Paging').find_element_by_css_selector('a.layui-laypage-last').text) # 这个是首页分了多少页,也就是要点多少次“下一页”else:# 如果不是第一次遇到首页url,意味着不需要抓取这个url,而是点击“下一页”self.browser.switch_to.window(self.browser.window_handles[0])if request.meta['page'] <= self.max_page:print("MAIN PAGE CHANGE : " + str(request.meta['page']) + " / " + str(self.max_page))self.browser.find_element_by_id('TableList_Paging').find_element_by_class_name('layui-laypage-next').click() # get next pageelse:return Noneelse:# 这是遇到了电影详情页的url,切换到第2个标签页然后得到详情页内容,传回去,传给哪个函数是由第一个文件spider里callback指定的,middleware只需要不择手段拿到网页内容即可。print("NEW PAGE GET : " + request.url)self.browser.switch_to.window(self.browser.window_handles[1])self.browser.get(request.url)time.sleep(2)return HtmlResponse(url=self.browser.current_url, body=self.browser.page_source, encoding="utf-8",request=request)
- 在setting中注册
ROBOTSTXT_OBEY = False
COOKIES_ENABLED = FalseDOWNLOADER_MIDDLEWARES = {'scrapy.downloadermiddlewares.useragent.UsserAgentMiddleware': None,'movie_data.middlewares.HandlessMiddleware': 200,
}
scrapy配合selenium爬取需要反复操作同一个动态页面的方法,解决点击“下一页”但是URL相同的网站相关推荐
- Python集成scrapy和selenium爬取苏宁图书
Python集成scrapy和selenium爬取苏宁图书 环境:python3.6 pycharm2018.1.3 前言 本人渣渣一枚,为爬虫苏宁图书获取数据,将获得的数据保存在MangoDB中,现 ...
- python爬取加密qq空间_使用python+selenium爬取qq空间好友动态
使用python+selenium爬取qq空间好友动态 分析过程如下: 要想用selenium登陆qq空间,必须点击账号密码登陆按钮然后再填写账号密码登陆. 1.PNG 点击账号密码按钮后跳转到如下页 ...
- 实战案例 | Scrapy 集成Selenium爬取智联招聘数据
人生苦短,快学Python! 初学scrapy之后,发现就是效率对比于selenium和requests快了很多,那么问题来了,如果网站设置了反爬,比如User-Agent反爬,cookie反爬,IP ...
- 利用scrapy-splash爬取JS生成的动态页面
目前,为了加速页面的加载速度,页面的很多部分都是用JS生成的,而对于用scrapy爬虫来说就是一个很大的问题,因为scrapy没有JS engine,所以爬取的都是静态页面,对于JS生成的动态页面都无 ...
- 用Scrapy和Selenium爬取动态数据
文章参考千锋教育大佬的课程: https://www.bilibili.com/video/BV1QY411F7Vt?p=1&vd_source=5f425e0074a7f92921f53ab ...
- python selenium爬取斗鱼王者荣耀直播页面
目标网站 在这里插入图片描述 抓取第一个直播的标题 现在来实现批量抓取 这里用xpath匹配 第一页抓取完毕,开始抓取剩下的页数 一共31页,每页数据为一个列表,全部数据套在一个大列表中 以下是完整代 ...
- 使用selenium爬取唯品会
使用selenium爬取唯品会 1.基本步骤 2.通过程序控制浏览器下拉滚动条获取加载信息 3.完成这个爬虫程序 使用selenium爬取动态加载的网页,爬取唯品会的商品 1.基本步骤 首先,创建一个 ...
- 利用selenium 爬取豆瓣 武林外传数据并且完成 数据可视化 情绪分析
全文的步骤可以大概分为几步: 一:数据获取,利用selenium+多进程(linux上selenium 多进程可能会有问题)+kafka写数据(linux首选必选耦合)windows直接采用的是写my ...
- 基于python和selenium爬取JD商城商品信息并且分析用户对于产品的满意程度
我把整个代码都托管在github上了,那里面有详细的api说明文档 https://github.com/hao297531173/JDCommentSpider/tree/master PS:获取的 ...
最新文章
- Java中final关键字如何使用?
- matlab中如何区分两幅图的亮度_高中历史教学中利用老地图设计习题的尝试
- 好好学python · 字典
- Html5里frameSet不在使用的替代方法,使用ifram
- Android UI开发第二十九篇——Android中五种常用的menu(菜单)
- MyEclipse打开闪退
- OptiCoupe 6:光学切割面板和型材切割优化[OptiCut]
- 坐标计算机在线使用,caslo计算器计算坐标的方法
- SiamRPN代码分析:test
- 变年轻特效怎么制作?这三个方法你值得收藏
- 谭民机器人_机器人技术研究进展_谭民
- 不良事件总结怎么写_一份年度护理不良事件报告是怎样写成的
- 大地测量的基准面和基准线
- 记2019北航计算机夏令营体验~
- C#根据百家姓,将姓转拼音处理
- 无线802.1x认证服务器,TP-Link无线路由器+Radius认证服务器实现无线终端802.1X认证...
- php5.5.30 redis dll,php_redis.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家
- iOS 访问网络权限
- cmw500 lte非信令测试_如何分辩cmw500是信令还是非信令?
- 计算机大二总结范文,大二学年总结范文
热门文章
- 使用PyCharm运行第一行python代码
- code回归采访哭 ladies_南太铉直播下跪?星船新男团?Mina归队?Kingdom来了?itzy回归?...
- 《OpenGL编程指南(原书第8版)》——计算着色器
- UE4手册中文翻译速查表
- JavaScript面向对象--继承 (超简单易懂,小白专属)...
- 【Processing-日常1】小圆碰撞
- Esper学习笔记四:EPL语法(2)
- 高性能框架gevent和gunicorn在web上的应用及性能测试
- Apache shiro
- 20135316王剑桥 linux第六周课实验笔记