scrapy框架中selenium使用是怎样,能解决什么问题
Admin 2022-07-09 群英技术资讯 344 次浏览
在通过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的文件下写入相对路径,没有成功。免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
应用场景举例描述: Lock 互斥锁:举例说明-C有三个同事同时需要上厕所,但是只有一间厕所,将同事比作进程,多个进程并打抢占一个厕所,我们要保证顺序优先, 一个个来,那么就必须串行,先到先得,有人使用了,就锁住,结束后剩余的人继续争抢
这篇文章主要介绍了Python数据类型和常用操作,数值数据类型用于存储数值,数据类型不可改变,改变会分配一个新的对象,下文更多相关内容介绍需要的小伙伴可以参考一下
这篇文章主要介绍了Python包装之对象处理,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
这篇文章主要为大家详细介绍了python版单链表反转,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
这篇文章主要介绍了Python dataframe如何设置index,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008