引入

  • 在通过scrapy框架进行某些网站数据爬取的时候,往往会碰到页面动态数据加载的情况发生,如果直接使用scrapy对其url发请求,是绝对获取不到那部分动态加载出来的数据值。但是通过观察我们会发现,通过浏览器进行url请求发送则会加载出对应的动态加载出的数据。那么如果我们想要在scrapy也获取动态加载出的数据,则必须使用selenium创建浏览器对象,然后通过该浏览器对象进行请求发送,获取动态加载的数据值。

1.案例分析:

- 需求:爬取网易新闻的国内板块下的新闻数据

- 需求分析:当点击国内超链进入国内对应的页面时,会发现当前页面展示的新闻数据是被动态加载出来的,如果直接通过程序对url进行请求,是获取不到动态加载出的新闻数据的。则就需要我们使用selenium实例化一个浏览器对象,在该对象中进行url的请求,获取动态加载的新闻数据。

2.selenium在scrapy中使用的原理分析:

当引擎将国内板块url对应的请求提交给下载器后,下载器进行网页数据的下载,然后将下载到的页面数据,封装到response中,提交给引擎,引擎将response在转交给Spiders。Spiders接受到的response对象中存储的页面数据里是没有动态加载的新闻数据的。要想获取动态加载的新闻数据,则需要在下载中间件中对下载器提交给引擎的response响应对象进行拦截,切对其内部存储的页面数据进行篡改,修改成携带了动态加载出的新闻数据,然后将被篡改的response对象最终交给Spiders进行解析操作。

3.selenium在scrapy中的使用流程:

    1.在spider的构造方法中创建一个浏览器对象(作为当前spider的一个属性)
2.重写spider的一个方法closed(self,spider),在该方法中执行浏览器关闭的操作
3.在下载中间件的process_response方法中,通过spider参数获取浏览器对象
4.在中间件的process_response中定制基于浏览器自动化的操作代码(获取动态加载出来的页面源码数据)
5.实例化一个响应对象,且将page_source返回的页面源码封装到该对象中
6.返回该新的响应对象

4.代码:

爬虫代码:

import scrapy
from selenium import webdriver class WangyiSpider(scrapy.Spider):
name = 'wangyi'
# allowed_domains = ['www.xxx.com']
start_urls = ['http://war.163.com/']
def __init__(self):
self.bro = webdriver.Chrome(executable_path=r'F:\上课作业视频\爬虫\s15day137爬虫\chromedriver.exe')
def parse(self, response):
div_list = response.xpath('//div[@class="data_row news_article clearfix "]')
for div in div_list:
title = div.xpath('.//div[@class="news_title"]/h3/a/text()').extract_first()
print(title)
def closed(self,spider):
print('关闭浏览器对象!')
self.bro.quit()

middlewares.py

from scrapy import signals
from scrapy.http import HtmlResponse
from time import sleep def process_response(self, request, response, spider):
# Called with the response returned from the downloader. # Must either;
# - return a Response object
# - return a Request object
# - or raise IgnoreRequest
print('即将返回一个新的响应对象!!!')
#获取动态加载出来的数据
bro = spider.bro
bro.get(url=request.url)
sleep(3)
#包含了动态加载出来的新闻数据
page_text = bro.page_source
sleep(3)
return HtmlResponse(url=spider.bro.current_url,body=page_text,encoding='utf-8',request=request)

settings配置

USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'
ROBOTSTXT_OBEY = False
DOWNLOADER_MIDDLEWARES = {
'wangyiPro.middlewares.WangyiproDownloaderMiddleware': 543,
}
LOG_LEVEL = 'ERROR'

最新文章

  1. 常用JavaScript触发事件
  2. 用友U8 归纳采购退货结算三种情况
  3. JQ实现右下角scrollTop()事件
  4. NYOJ题目1051simone牌文本编辑器
  5. Java程序员要求具备的10项技能
  6. runtime获取类名,遍历变量,遍历对象,遍历方法
  7. stringlist
  8. QM课程02-外部功能
  9. js基础第八天
  10. C#之移动无标题栏窗体功能的实现!...
  11. 彩色图像--色彩空间 YIQ 、YUV 、YCbCr 、YC1C2 和I1I2I3
  12. Redis源码剖析--源码结构解析
  13. socket系列之socket服务端与客户端如何通信
  14. leetcode — unique-binary-search-trees
  15. vue部署的路径问题
  16. MySQL sql_mode 说明(及处理一起 sql_mode 引发的问题)(转)
  17. 5随机到7随机的C++实现
  18. JavaScript 作用域、命名空间及闭包
  19. 涂抹mysql笔记-安装mysql
  20. 「LOJ2000~2023」各省省选题选做

热门文章

  1. Python新手最容易犯的十大错误
  2. shell脚本判断端口是否打开
  3. shadow使用方法
  4. 通过NGINX location实现一个域名访问多个项目
  5. 【VS开发】【智能语音处理】解读男女声音的区别:亮度,糙度
  6. python 迭代器(第二次总结)
  7. Being a Good Boy in Spring Festival
  8. Luogu P1948 [USACO08JAN]Telephone Lines
  9. Ubuntu下TP5隐藏入口文件
  10. element-ui使用el-tabs组件的时候浏览器直接卡死的问题