scrapy python 框架爬虫 这些词初接触者肯定不知所云。所以读者可以直接度娘或者Google这些词条“什么是python“,“what is scrapy”,“scrapy 基础入门”,“scrapy example”等等诸如此类的。可以看到各种各样的文章,读者都可以快速的对scrapy python做基本的了解。
故笔者不再做多余的赘述最最基础的简介如什么是爬虫 ,Scrapy框架模组,Scrapy框架流程等,笔者直接带大家实操一下基于scrapy的基本网页爬取。
scrapy python 框架爬虫
scrapy 基本步骤
创建工程、编写爬虫文件、执行工程
- scrapy startproject xxxPro — 固定模型创建工程,自动生成items.py, pipeline.py,settings.py等文件。
- 在项目目录下输入: scrapy genspider spiderName www.XXX.com 创建具体的爬虫文件
- 修改相应的爬虫文件、items、pipelines、settings、中间件等文件来完善具体的爬取细节
- 在项目目录下执行: scrapy crawl spiderName
基本命令
- scrapy bench: 测试scrapy的基本性能等
- scrapy fetch: 通过scrapy下载器下载指定的url
- scrapy genspider : 创建爬虫,类似于python XX.py
- scrapy runspider: 启动爬虫
- scrapy settings: 获取setting值
- scrapy shell ‘http://XXX.com‘: 启动一个shell界面,类似于ipthon的效果,可以通过命令行来对指定的url进行单步调试
- scrapy startproject: 创建工程项目
scrapy 框架爬虫 入门实例介绍
- scrapy startproject feixiaohao: 生成如下结构的文件夹及文件
# windows 可以需要通过命令 tree /f , 来看到结构 └─feixiaohao │ scrapy.cfg │ └─feixiaohao │ items.py │ middlewares.py │ pipelines.py │ settings.py │ __init__.py │ └─spiders __init__.py
项目中自动生成文件说明
- scrapy.cfg: 项目的配置文件,会包含项目的基本信息和一些基础设置,每个版本的scrpay可能会有些许的差异
- items.py 项目目标文件,结构化的数据字段,提供一些数据校验的防护,减少错误;类似orm映射
- pipelines.py 项目管道文件
- middlewares.py 项目中间件文件
- settings.py 项目设置文件,默认启动项,公共资源配置等
- scrapy genspider -l : 指定
scrapy genspider -l Available templates: basic : 基础爬虫类型的文件 crawl :定义一些rules,适合深度爬取一些有规律网站 csvfeed :按行遍历解析csv源文件 xmlfeed :按各节点迭代解析xml源文件
- cd 到feixiaohao文件夹里, 输入命令: scrapy genspider feixh “https://www.feixiaohao.co/” 来只做具体的爬虫文件,在spiders文件中会初始化一个新的具体爬虫文件
│ scrapy.cfg │ └─feixiaohao │ items.py │ middlewares.py │ pipelines.py │ settings.py │ __init__.py │ └─spiders feixh.py __init__.py
- feixh.py文件的核心内容
class FeixhSpider(scrapy.Spider): name = 'feixh' allowed_domains = ['https://www.feixiaohao.co/'] start_urls = ['https://www.feixiaohao.co/news?tab=0'] ##start_urls = ['https://www.feixiaohao.co'] def parse(self, response): pass
正常情况feixh.py文件的start_urls是咱们在构建爬虫文件时指定的地址, 因为笔者要爬虫咨询相关的内容,所有手动换到的具体的地址。
接下来我们要做的就是要对爬取的网页进行页面分析,如何分析呢? 之前笔者在爬虫入门的文章中介绍过在浏览器中查看元素xpath的方法,或者直接对页面做正则解析,但是不管哪种方式都需要我们在浏览器中查看页面源码来看一下页面是如何加载的。 - 利用Chrome 的Xpath Helper插件辅助解析页面内容
我们定义需要爬取的item.pyclass FeixiaohaoItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() title = scrapy.Field() # 咨讯标题 href = scrapy.Field() # 咨讯地址 date = scrapy.Field() # 咨讯发布日期 source_name = scrapy.Field() # 资讯来源 spider_time = scrapy.Field() # 资讯爬取时间
feixh.py的parse方法具体如下,里边涉及到的xpath解析就是先在页面找到元素再复制过来修正得到的,但是有一个问题就是页面的xpath路径是绝对路径定位到元素本身,一般我们到代码中时需要往上一层。
这里涉及到一些细节的调试,这个调试我们可以通过scrapy shell来达到具体的效果def parse(self, response): html = etree.HTML(response.body.decode('utf-8')) datas = html.xpath('//*[@id="__layout"]/section/div[1]/div/div[1]/div/div[2]/div[2]')[0] for data in datas.xpath('./article'): item = FeixiaohaoItem() title = data.xpath('.//div[@class="info"]/a[1]/text()')[0] href = data.xpath('.//div[@class="info"]/a[1]/@href')[0] source = data.xpath('.//div[@class="info"]//a[@class="name"]/text()')[0] date = data.xpath('.//div[@class="info"]/div[@class="time"]/span/text()')[0] item['title'] = title item['href'] = href item['date'] = date item['source_name'] = source item['spider_time'] = time.time() yield item
- scrapy shell “https://www.feixiaohao.co/news?tab=0“
scrapy shell 这个命令我们可以dos窗口或者pycharm的 Terminal里来执行,这个就类似于ipython的运行环境,这样我们就可以逐步的对response进行解析,因为当scrapy shell运行出来后就已经可以解析到response了,读者可以自行print(response)看到相关的内容
有一点需要主要,这个环境中所有用到的包都需要自行import,就跟运行ipython是一样的效果。 - 正常的逻辑就是继续找到翻页的连接地址或者翻页按钮跳转的地址,做循环解析。
但是如果页面是翻页按钮或者后续加载按钮是用js触发的接口,那么我们就需要调整start_url列表的内容。,需要我们在浏览器中找到翻页按钮对应的接口地址。start_url= ['https://***/news/hot?page={}&per_page=20&webp=1'.format(i) for i in range(1, 29)]
这样做的话我们的parse方法就要从新写逻辑,就不能用xpath来做解析了,而是直接接口对应的返回值做json处理。