原文地址:https://program-park.top/2023/12/01/reptile_5/
本文章中所有内容仅供学习交流使用,不用于其他任何目的,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关。
Scrapy 是一个为了爬取网站数据,提取结构性数据而编写的应用框架,是目前 Python 中最受欢迎的爬虫框架之一,简单、方便、易上手。 它的应用领域很多,比如网络爬虫开发、数据挖掘、数据监测、自动化测试等。
Scrapy 吸引人的地方在于它是一个框架,将 request (异步调度和处理)、下载器(多线程的 Downloader)、解析器(selector)和 twisted(异步处理)等封装在一起,任何人都可以根据需求方便的修改项目。它也提供了多种类型爬虫的基类,如 BaseSpider、sitemap 爬虫等,最新版本又提供了 Web2.0 爬虫的支持。
官方网址是 https://scrapy.org/
使用 pip 直接安装:
pip install scrapy
Scrapy 依赖的库比较多,比如 lxml、Twisted、pyOpenSSL 等等,我这边的建议是,先执行pip install scrapy
命令,查看安装提示是否报错,如报错就根据报错信息将缺少的依赖用 pip 安装即可,这些对于开发人员是属于最基本的东西,所以我就不放详细过程了。
架构组件:
注意:所有模块(除引擎外)之间是相互独立的,只跟引擎进行交互,并不能直接互相交互。即各大组件(除引擎)之间一定是不能够直接进行交流的。
2
步到第8
步,直到 Scheduler 中没有更多的 Request,Engine 关闭该网站,爬取结束。用户只需要将自己的爬取请求输入到对应的 Spider 中,同时将自己对文件的加工请求写入到对应的 Item Pipeline 中,所以一般使用 Scrapy 框架都只修改 Spider 和 Item Pipeline。
下面以爬取慕课网免费课程(https://www.imooc.com/course/list)第一页信息为例概述开发 Scrapy 项目的流程。
进入待创建项目所在的文件夹下,执行scrapy startproject MyReptile
命令创建项目,MyReptile
是项目名称。
在 PyCharm 中点击File
,选择Open
,找到刚刚创建的项目并打开:
打开项目之后可以看到,我们创建的项目目录结构如下:
Spider 是自定义的类,Scrapy 用它从网页中抓取数据,并解析抓取的结果。这个类必须继承 Scrapy 提供的 Spider 类scrapy.Spider
,并定义 Spider 的名称和起始请求,以及怎样处理爬取结果的方法,
进入刚刚创建的文件夹,执行命令scrapy genspider myspider www.imooc.com
创建一个 Spider,myspider
是 Spider 名称,www.imooc.com
是网站域名。
执行完毕之后,spiders
文件夹下就生成了一个myspider.py
文件:
文件代码中有三个属性和一个方法:
创建完 Spider 文件之后,接着定义一个容器来保存要爬取的数据,我们对items.py
文件进行更改或者创建一个新的文件来定义 item 都行。
创建 Item 需要继承 scrapy.Item 类,并且定义类型为 scrapy.Field 的字段。例如我们要爬取慕课网站课程的信息,包括课程名称,课程 URL,课程图片 URL,课程描述,学习人数。
import scrapy
class MyreptileItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
# 课程名称
title = scrapy.Field()
# 课程url
url = scrapy.Field()
# 课程标题图片url
image_url = scrapy.Field()
# 课程描述
introduction = scrapy.Field()
# 学习人数
student = scrapy.Field()
之后编写 Spider 中parse()
的内容,parse()
方法的参数 response 是 start_urls
里 URL 爬取后的结果,所以在parse()
中,我们可以直接对 response 的内容进行解析:
import scrapy
# 引入容器
from MyReptile.items import MyreptileItem
class MyspiderSpider(scrapy.Spider):
name = 'myspider'
allowed_domains = ['www.imooc.com']
start_urls = ['https://www.imooc.com/course/list']
# 填写爬写方法
def parse(self, response):
# 实例化一个容器保存爬取信息
item = MyreptileItem()
# 这部分是爬取部分,使用xpath的方式选择信息,具体方法根据网页结构而定
# 先获取每个课程的div
for box in response.xpath('//div[@class="course-card-container"]/a[@target="_blank"]'):
# 获取div中的课程标题
# strip() 方法用于移除字符串头尾指定的字符(默认为空格)
# extract()返回的所有数据,存在一个list里。extract_first()返回的是一个string,是extract()结果中第一个值。
item['title'] = box.xpath('.//h3/text()').extract()[0].strip()
# 获取每个div中的课程路径
item['url'] = 'http://www.imooc.com' + box.xpath('.//@href').extract()[0]
# 获取div中的标题图片地址
item['image_url'] = 'http:'+box.xpath('.//img[@data-original]').extract()[0]
# 获取div中的课程简介
#item['introduction'] = box.xpath('.//p[@class="course-card-desc"]/text()').extract()[0].strip()
item['introduction'] = box.xpath('.//p/text()').extract()[0].strip()
# 获取div中的学生人数
item['student'] = box.xpath('.//div[@class="course-card-info"]/span[2]/text()').extract()[0].strip()
# 返回信息
yield item
执行完以上步骤后,我们可以执行命令scrapy crawl myspider
运行爬虫,控制台就会给出爬取的数据。
运行完 Scrapy 后,我们只在控制台看到了输出结果,我们可以利用 Scrapy 提供的 Feed Exports 轻松抓取输出的结果。 例如,我们想将结果保存成 csv 文件,可以在 Pycharm 的 Terminal 窗口中执行如下命令:crawl myspider -o myspider.csv
。
输出格式还支持很多种,例如 json、 xml 、 pickle 、 marshal 等。 下面命令对应的输出分别为 json 、 xml 、 pickle 、 marshal 格式以及远程输出。
scrapy crawl myspider -o myspider.json
scrapy crawl myspider -o myspider.xml
scrapy crawl myspider -o myspider.pickle
scrapy crawl myspider -o myspider.marshal
scrapy crawl myspider -o ftp://user:[email protected]/myspider.csv
其中, ftp 输出需要正确配置用户名、密码、地址、输出路径,否则会报错。
【1】https://zhuanlan.zhihu.com/p/598764670
【2】https://zhuanlan.zhihu.com/p/431078183?utm_id=0
【3】https://blog.csdn.net/weixin_52245535/article/details/128695051
【4】https://www.cnblogs.com/hsiang/p/15139627.html
【5】https://m.biancheng.net/view/2027.html
【6】https://www.zhihu.com/question/439914883/answer/2607880092
【7】https://www.jianshu.com/p/063026368b3c
【8】https://www.coonote.com/python-note/python-scrapy-intro.html
【9】https://www.bilibili.com/video/BV1Db4y1m7Ho?p=90