0


网络数据爬虫(scrapy+selenium)实现页面跳转及文件/附件下载

一、基于scrapy的基本架构搭建(往期博文中已有基本介绍:https://blog.csdn.net/csl136520054/article/details/118902880)

二、selenium实现自动跳转“下一页”:
1、selenium简介:
一种自动化测试工具,可以模拟人来操作浏览器,需要浏览器页面加载完成才能操作,对网速要求严格,可以用于重复性的操作。
2、需求:爬取条目过多,存在页面跳转,故利用selenium模拟点击并实现跳转
3、准备:
(1)根据自己系统平台信息,下载对应的浏览器驱动(https://chromedriver.storage.googleapis.com/index.html),如我自己的Windows平台,谷歌浏览器版本信息:
在这里插入图片描述
(2)环境变量配置
下载完成后,将ChromeDriver.exe可执行文件路径配置到系统环境变量下
在Windows下,建议直接将chromedriver.exe文件放到Python的Scripts目录下或selenium所在路径,如下图所示:
在这里插入图片描述
(3)pip install selenuim 按装selenium模块并引入驱动:

from selenium import webdriver

driver = webdriver.Chrome(executable_path="D:\\chromedriver_win32\\chromedriver.exe")

3、自动翻页代码实现:
定位“下一页”元素并实现自动点击跳转:
在这里插入图片描述
tips!可能出现的问题:

Message: stale element reference: element is not attached to the page document

根本原因:爬取的时候,获取过于频繁,需要在每次获取完成翻页后强制sleep几秒。

三、利用scrapy自带文件下载功能实现附件下载:
1、需求:爬取信息存在附件需要进行下载
2、方法:Scrapy提供了FilesPipeline实现文件下载,FilesPipeline使用时通过item的一个指定字段(如:file_urls)将要下载的文件或图片的url传递给它,它便会自动将文件或图片下载到本地。
3、代码实现:
(1)第一步:在配置文件settings.py中启用FilesPipeline并设置文件下载路径

ITEM_PIPELINES = {
   'zrzyPolicies.pipelines.ZrzypoliciesPipeline': 300,
   'zrzyPolicies.pipelines.MyFilesPipeline':1
}

FILES_STORE = 'F:/Download'
FILES_URLS_FIELD = 'file_urls'
MEDIA_ALLOW_REDIRECTS = True

(2)在item.py中定义file_urls和files两个字段,分别存放待下载文件地址和对应文件名称列表(因为可能一条记录对应有对个待下载附件,所以用列表存储)

file_urls = scrapy.Field()
files = scrapy.Field()

(3)pipelines.py文件修改,重写FilesPipeline,实现文件下载及保存:

# 定义文件下载类
class MyFilesPipeline(FilesPipeline):  #在scrapy自带FilesPipeline的基础上创建自己的pipeline
#通过item获取具体的文件地址和文件名称信息,根据自己对item的设置,具体实现可能有所不同
    def get_media_requests(self, item, info):
        if len(item['file_urls'])>2:
            urls = item['file_urls'].split(';')
            names = item['files'].split(';')
            for i in range(len(urls)):
                file_url = urls[i]
                file_name = names[i]
                yield scrapy.Request(file_url, meta={'file_name': file_name})

#设置文件保存路径及文件名
    def file_path(self, request, response=None, info=None):
        file_name = request.meta['file_name']
        return 'zrzy/%s' % (file_name)

(4)主爬虫文件spider.py中相关部分实现:

contList = response.xpath("//div[@class ='article-content']/p[contains(@style,'margin-bottom')]") 
# 可能有多个附件,放到一个列表中
file_list = []
nameList =[]
for fujianUrl in contList:
    f_list = fujianUrl.css("a::attr(href)").get()
    if isinstance(f_list,str):
        file_list.append("http:" + f_list)
        fName = fujianUrl.xpath("string(.//a)").extract()[0]
        nameList.append(fName)

item['file_urls'] = ';'.join(file_list)
item['files'] = ';'.join(nameList)
yield item

完整代码地址:
https://github.com/Chenshunli/policiesSpider

参考链接:
https://blog.csdn.net/weixin_36279318/article/details/79475388
https://www.cnblogs.com/mayyan/p/10062869.html
https://blog.csdn.net/xiaogeldx/article/details/104205651

标签: python 爬虫 大数据

本文转载自: https://blog.csdn.net/csl136520054/article/details/123878084
版权归原作者 Cherry CSL 所有, 如有侵权,请联系我们删除。

“网络数据爬虫(scrapy+selenium)实现页面跳转及文件/附件下载”的评论:

还没有评论