selenium在scrapy中的使用代码
作者:小黑班♪(・ω・)ノ 发布时间:2021-11-24 09:34:16
标签:scrapy,selenium
在通过scrapy框架进行某些网站数据爬取的时候,往往会碰到页面动态数据加载的情况发生,如果直接使用scrapy对其url发请求,是绝对获取不到那部分动态加载出来的数据值。但是通过观察我们会发现,通过浏览器进行url请求发送则会加载出对应的动态加载出的数据。那么如果我们想要在scrapy也获取动态加载出的数据,则必须使用selenium创建浏览器对象,然后通过该浏览器对象进行请求发送,获取动态加载的数据值。本文重点给大家介绍selenium在scrapy中的使用,具体内容如下所示:
使用目的
爬取网易新闻国内、国际、军事、航空4个版块的新闻。在测试中发现各版块的新闻是动态加载的,如果直接爬取无法获取,使用selenium帮助获取此部分数据。
代码
spider
import scrapy
from selenium import webdriver
from wangyiPro.items import WangyiproItem
class WangyiSpider(scrapy.Spider):
name = 'wangyi'
# allowed_domains = ['www.xxx.com']
start_urls = ['https://news.163.com/']
model_url = []
hro = webdriver.Chrome()
def parse(self, response):
# 从所有版块中筛选出所需要下载的4个版块
li_list = response.xpath('/html/body/div[1]/div[1]/div[2]/div[2]/div[2]/div[2]/div/ul/li')
indexs = [3,4,6,7]
for index in indexs:
model_li = li_list[index]
model_list = model_li.xpath('./a/@href').extract_first()
self.model_url.append(model_list)
for url in self.model_url:
yield scrapy.Request(url=url,callback=self.parse_model)
# 数据解析:新闻标题+新闻详情页的url(动态加载数据)
def parse_model(self,response):
# 直接对response解析无法获取该数据(动态加载数据)
# 无法拿到动态加载数据返回的响应数据就不足
# 使用中间件修改不满足需求的响应对象中的响应数据,将其改为包含动态加载数据的响应数据
div_list = response.xpath('/html/body/div/div[3]/div[4]/div[1]/div[1]/div/ul/li/div/div')
for div in div_list:
title = div.xpath('./div/div[1]/h3/a/text()').extract_first()
new_url_detail = div.xpath('./div/div[1]/h3/a/@href').extract_first()
if new_url_detail:
item = WangyiproItem()
item['title'] = title
yield scrapy.Request(url=new_url_detail,callback=self.parse_detail,meta={'item':item})
def parse_detail(self,response):
# 返回的列表,需要将其转换为字符串
content = response.xpath('/html/body/div[3]/div[1]/div[3]/div[2]/p/text()').extract()
content = ''.join(content)
item = response.meta['item']
item['content'] = content
yield item
# 重写爬虫类父类方法,该方法在爬虫程序执行结束后立即执行
def closed(self,spider):
# 打开selenium需要关闭
self.hro.quit()
middlewares
from time import sleep
from scrapy.http import HtmlResponse#scrapy封装好的响应类
class WangyiproDownloaderMiddleware:
def process_request(self, request, spider):
return None
# 拦截所有的响应对象
# 整个工程发起的请求:1+4+n 对应相同的响应
def process_response(self, request, response, spider):
# 从所有拦截对象中找到4个需修改的响应对象
if request.url in spider.model_url:
hro = spider.hro
hro.get(request.url)
sleep(2)
# 网页下拉到底,获取更多动态加载数据
hro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
sleep(1)
page_text = hro.page_source
# response.text = page_text
# 返回一个新的响应对象
return HtmlResponse(url=request.url,body=page_text,encoding='utf-8',request=request)
# 如果不是需要修改的响应数据,不做修改
else:
return response
def process_exception(self, request, exception, spider):
pass
效果
总结
hro = webdriver.Chrome()
我是直接将Chromedriver写入配置文件,所以直接实例化对象即可,如果没有写入配置文件,写为hro = webdriver.Chrome(executable_path='绝对路径')
。尝试过将Chromedriver放到pycharm的文件下写入相对路径,没有成功。使用selenium在结束后需要关闭,可以改写爬虫类父类方法closed()
settings里修改三件套并且打开下载中间件和items
来源:https://blog.csdn.net/weixin_49487589/article/details/117228393


猜你喜欢
- 如果我们的web应用有大量的异步请求,而这些异步请求是在web服务器认证的情况下,那当我们请求发生在服务器认证失效下,服务器自动302到登录
- 今天学习了如何使用pygame来制作小游戏,下面是五子棋的代码,我的理解都写在注释里了import pygame# 导入pygame模块pr
- 这几天正在追剧,原名《大秦帝国之天下》的《大秦赋》,看着看着又想把前几部刷一遍了,但第一部《裂变》自己没有高清资源,搜了一波发现yout
- 为什么要用flash呢?动画流畅,视觉效果好缓存能力强那使用flash有什么问题呢?需要Flash播放器在M$的补丁打遍天下之前IE有那神奇
- 上次介绍了如何通过钉钉进行群通知,有同学反馈自己更习惯使用企业微信或公司使用了企业微信,希望也能出个基于Python的企业微信的群通知教程,
- 源码如下from scapy.all import *import logginglogging.getLogger('scapy.
- sql 使用系统存储过程 sp_send_dbmail 发送电子邮件语法:sp_send_dbmail [ [ @profile_name
- 问题,用python生成如下所示的1000个txt文件?解答:import osfor i in range(0,1001): os.mkn
- <?php //设置我们将要使用的文件 $srcurl = "http://localhost/index.php"
- js运行效果,含公历农历,生肖及节日的javascript日历代码:<html><head><meta htt
- 一. 视图集与路由的使用使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中:list() 提供一组数据retrieve() 提
- 1、前言接上节,我们初步体验了layui-vue的用法。相比其他ui框架,layui-vue的数据结构显得不是非常友好,但是经过数据拼凑也是
- 前言大家谈及用Pandas导出数据,应该就会想到to.xxx系列的函数。这其中呢,比较常用的就是pd.to_csv()和pd.to_exce
- CGAN的全拼是Conditional Generative Adversarial Networks,条件生成对抗网络,在初始GAN的基础
- asp之家注:为什么要防止访客频繁刷新页面呢?也许你会说他想刷新就让他刷新吧,没什么关系,而且还增加了网页的PV,呵呵。但是有的页面我们可能
- 大家好,我是启航。本文将给大家分享一个实用的Python办公自动化脚本 「利用Python批量翻译英文Word文档并保留格式」,最终效果甚至
- Django(python)简单实现android的服务器端1. 所需工具PyCharm--python编辑工具,这里要写Django,因此
- 测试配置文件test.conf内容如下:[first]w = 2v: 3c =11-3[second]sw=4test: hello测试配置
- 今天给大家分享一个用原生JS实现的好看计数器,效果如下:以下是代码实现,欢迎大家复制粘贴和收藏。<!DOCTYPE html>&
- 安装npm1、检查node,未安装在这里下载最新版安装。2、检查npm,node自带npm但不是最新版本,需要命令更新:npm instal