首先这种网站一定要设置爬取的速率,目标网站用这种方式写入网页估计是被爬虫搞怕了,大概率有更简单的反爬方法,因此爬取速率要注意。博主要爬的网站是一个电影网站:艺恩,点击下一页可以看到其实执行了一个js拿数据,但是URL却没有任何变化,我们需要一路下一页下一页点下去,然后把展示出的电影详情也搞到。

爬取思路:

  1. 启动selenium,控制Chrome开两个标签页,第一个标签页显示主页,第二个标签页显示不同的电影详情页
  2. 如果是需要点击下一步的,就先跳转到第一个tab,然后点击“下一步”,把网页信息传回去。
  3. 如果要显示电影详情页,就跳转到第二个tab,然后把网页信息传回去。

代码:

  1. 首先是爬虫文件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
  1. 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)
  1. 在setting中注册
ROBOTSTXT_OBEY = False
COOKIES_ENABLED = FalseDOWNLOADER_MIDDLEWARES = {'scrapy.downloadermiddlewares.useragent.UsserAgentMiddleware': None,'movie_data.middlewares.HandlessMiddleware': 200,
}

scrapy配合selenium爬取需要反复操作同一个动态页面的方法,解决点击“下一页”但是URL相同的网站相关推荐

  1. Python集成scrapy和selenium爬取苏宁图书

    Python集成scrapy和selenium爬取苏宁图书 环境:python3.6 pycharm2018.1.3 前言 本人渣渣一枚,为爬虫苏宁图书获取数据,将获得的数据保存在MangoDB中,现 ...

  2. python爬取加密qq空间_使用python+selenium爬取qq空间好友动态

    使用python+selenium爬取qq空间好友动态 分析过程如下: 要想用selenium登陆qq空间,必须点击账号密码登陆按钮然后再填写账号密码登陆. 1.PNG 点击账号密码按钮后跳转到如下页 ...

  3. 实战案例 | Scrapy 集成Selenium爬取智联招聘数据

    人生苦短,快学Python! 初学scrapy之后,发现就是效率对比于selenium和requests快了很多,那么问题来了,如果网站设置了反爬,比如User-Agent反爬,cookie反爬,IP ...

  4. 利用scrapy-splash爬取JS生成的动态页面

    目前,为了加速页面的加载速度,页面的很多部分都是用JS生成的,而对于用scrapy爬虫来说就是一个很大的问题,因为scrapy没有JS engine,所以爬取的都是静态页面,对于JS生成的动态页面都无 ...

  5. 用Scrapy和Selenium爬取动态数据

    文章参考千锋教育大佬的课程: https://www.bilibili.com/video/BV1QY411F7Vt?p=1&vd_source=5f425e0074a7f92921f53ab ...

  6. python selenium爬取斗鱼王者荣耀直播页面

    目标网站 在这里插入图片描述 抓取第一个直播的标题 现在来实现批量抓取 这里用xpath匹配 第一页抓取完毕,开始抓取剩下的页数 一共31页,每页数据为一个列表,全部数据套在一个大列表中 以下是完整代 ...

  7. 使用selenium爬取唯品会

    使用selenium爬取唯品会 1.基本步骤 2.通过程序控制浏览器下拉滚动条获取加载信息 3.完成这个爬虫程序 使用selenium爬取动态加载的网页,爬取唯品会的商品 1.基本步骤 首先,创建一个 ...

  8. 利用selenium 爬取豆瓣 武林外传数据并且完成 数据可视化 情绪分析

    全文的步骤可以大概分为几步: 一:数据获取,利用selenium+多进程(linux上selenium 多进程可能会有问题)+kafka写数据(linux首选必选耦合)windows直接采用的是写my ...

  9. 基于python和selenium爬取JD商城商品信息并且分析用户对于产品的满意程度

    我把整个代码都托管在github上了,那里面有详细的api说明文档 https://github.com/hao297531173/JDCommentSpider/tree/master PS:获取的 ...

最新文章

  1. Java中final关键字如何使用?
  2. matlab中如何区分两幅图的亮度_高中历史教学中利用老地图设计习题的尝试
  3. 好好学python · 字典
  4. Html5里frameSet不在使用的替代方法,使用ifram
  5. Android UI开发第二十九篇——Android中五种常用的menu(菜单)
  6. MyEclipse打开闪退
  7. OptiCoupe 6:光学切割面板和型材切割优化[OptiCut]
  8. 坐标计算机在线使用,caslo计算器计算坐标的方法
  9. SiamRPN代码分析:test
  10. 变年轻特效怎么制作?这三个方法你值得收藏
  11. 谭民机器人_机器人技术研究进展_谭民
  12. 不良事件总结怎么写_一份年度护理不良事件报告是怎样写成的
  13. 大地测量的基准面和基准线
  14. 记2019北航计算机夏令营体验~
  15. C#根据百家姓,将姓转拼音处理
  16. 无线802.1x认证服务器,TP-Link无线路由器+Radius认证服务器实现无线终端802.1X认证...
  17. php5.5.30 redis dll,php_redis.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家
  18. iOS 访问网络权限
  19. cmw500 lte非信令测试_如何分辩cmw500是信令还是非信令?
  20. 计算机大二总结范文,大二学年总结范文

热门文章

  1. 使用PyCharm运行第一行python代码
  2. code回归采访哭 ladies_南太铉直播下跪?星船新男团?Mina归队?Kingdom来了?itzy回归?...
  3. 《OpenGL编程指南(原书第8版)》——计算着色器
  4. UE4手册中文翻译速查表
  5. JavaScript面向对象--继承 (超简单易懂,小白专属)...
  6. 【Processing-日常1】小圆碰撞
  7. Esper学习笔记四:EPL语法(2)
  8. 高性能框架gevent和gunicorn在web上的应用及性能测试
  9. Apache shiro
  10. 20135316王剑桥 linux第六周课实验笔记