一、基于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
|