重新学习scrapy.
没几篇靠谱的文章.我就不信了,看着看着总能学会的.
什么是scrapy
scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,我们只需要实现少量的代码,就可以快速的抓取.
scrapy使用了twisted(异步)网络框架,可以加快我们的下载速度,而且包含了各种中间件接口,可以灵活的完成各种需求.
看一下各个部分的作用:
Scrapy运行流程大概如下:
- 引擎从调度器中取出一个链接(URL)用于接下来的抓取
- 引擎把URL封装成一个请求(Request)传给下载器
- 下载器把资源下载下来,并封装成应答包(Response)
- 爬虫解析Response
- 解析出实体(Item),则交给实体管道进行进一步的处理
- 解析出的是链接(URL),则把URL交给调度器等待抓取.
我们要做的:
- 新建项目 :scrapy startproject 项目名
- cd 项目文件夹
- 新建爬虫文件 :scrapy genspider 文件名 域名
- 明确目标(items.py)
- 写爬虫程序(文件名.py)
- 管道文件(pipelines.py)
- 全局配置(settings.py)
- 运行爬虫 :scrapy crawl 爬虫名
持久化步骤(6的补充):
1.爬虫文件爬取到数据后,需要将数据封装到items对象中。
2.使用yield关键字将items对象提交给pipelines管道进行持久化操作。
3.settings.py配置文件中开启管道
首先,要在终端输入下面的语句来生成一个新项目
代码语言:javascript复制scrapy startproject [projectname]
然后我们再cd进去我们的项目里,使用下面语句创建一个爬虫项目
代码语言:javascript复制scrapy genspider [spidername] [www.xxx.com]
# spidername是爬虫的名称
# www.xxx.com是允许爬取恶域名,和spider文件中的allow_domains的内容是一样的
我们打开文件夹看一下,里面的文件都是自动生成的,除了my_spider.py和runn.py是我创建的:
当我们想要执行爬虫时,我们的执行语句是
代码语言:javascript复制scrapy crawl [spidername]
但是这样做是很不方便的,我们可以在项目下创建一个叫做run.py的文件,写下以下代码,用运行的办法来执行爬虫
代码语言:javascript复制 from scrapy.cmdline import execute
execute("scrapy crawl spidername".split())
这样只要直接运行就可以执行爬虫了.
现在我们的文件夹理有很多个文件,他们各有各的作用:
1. spiders文件夹:这里存放爬虫的主程序,这里可以写多个爬虫文件,分别执行不同的爬虫功能。 2. items.py:这个文件定义了爬虫程序中爬取的字段信息,对应着数据库中的属性信息。 3. middlewares.py:下载中间件,可以对爬取到的网页信息尽心特定的处理。 4. pipelines.py:管道,也就是将返回来的item字段信息写入到数据库,这里可以写写入数据库的代码。 5. settings.py:配置文件。 **6. scrapy.cfg:**可以说是配置settings的文件,如果一个项目中包含多个settings.py配置文件,那么在这个文件中就可以选择使用哪个配置文件来管理项目。
首先我们看一下配置.
BOT_NAME:项目名
USER_AGENT:默认是注释的,这个东西非常重要,如果不写很容易被判断 为电脑,简单点写一个Mozilla/5.0即可
ROBOTSTXT_OBEY:是否遵循Robot协议,默认是true,需要改为false,否则很多东西爬不了
CONCURRENT_REQUESTS:最大并发数,很好理解,就是同时允许开启多少个爬虫线程
DOWNLOAD_DELAY:下载延迟时间,单位是秒,控制爬虫爬取的频率,根据你的项目调整,不要太快也不要太慢,默认是3秒,即爬一个停3秒,设置为1秒性价比较高,如果要爬取的文件较多,写零点几秒也行
COOKIES_ENABLED:是否保存COOKIES,默认关闭,开机可以记录爬取过程中的COKIE,非常好用的一个参数
现在逐一分析每一个文件:
spider.py
spider是由用户编写的类,用于从域中爬取信息.
spider定义了用于下载的url的初步列表,如何跟踪链接,如何解析网页,用于提取items.
要建立一个spider,必须为scrapy.Spider创建一个子类,并确定三个主要的,强制的属性.
name:爬虫的识别名,必须是唯一的.
start_urls:开始爬取的第一个url列表,其他的子url将会从url中继承生成.
parse()方法:调用时, 每一个从url返回的response对象将被传入作为参数.
访问起始URL并获取结果后的回调函数,该函数的response参数就是向起始的url发送请求后,获取的响应对象.该函数返回值必须为可迭代对象或者NUll .
scrapy为爬虫的start_urls属性中的每个url创建了一个scrapy.http.Request对象,并将爬虫的parse()方法指定为回调函数,这些Request首先被调度,然后被执行,之后通过parse方法, 对象被返回,结果也将反馈给爬虫.
items.py
Items是将要装载爬取的数据的容器,它工作方式像python中的字典.它用来定义您想抓取的数据
代码语言:javascript复制import scrapy
class xxxItem(scrapy.Item):
name = scrapy.Field()
pipelines.py
编写 item pipeline 将item存储到数据库中.
注:
(1).Item在Spider中被收集之后,它将会被传递到Item Pipeline,一些组件会按照一定的顺序执行对Item的处理;
(2)每个item pipeline组件(有时称之为“Item Pipeline”)是实现了简单方法的Python类。他们接收到Item并通过它执行一些行为,同时也决定此Item是否继续通过pipeline,或是被丢弃而不再进行处理。
(3)item pipeline的一些典型应用:
a)清理HTML数据
b)验证爬取的数据(检查item包含某些字段)
c)查重(并丢弃)
4)将爬取结果保存到数据库中
每个item pipeline组件都需要调用该方法,这个方法必须返回一个 Item (或任何继承类)对象, 或是抛出 DropItem 异常,被丢弃的item将不会被之后的pipeline组件所处理。
参数:
item (Item 对象) – 被爬取的item.(在spider中yield的item会被传到这里)
spider (Spider 对象) – 爬取该item的spider
注意事项:
- 如果要将数据存储到管道中,先要在settings里开启pipeline.
- response.xpath()返回的是一个含有selector对象的列表
- spider的数据通过yield传到pipeline,process_item中的item就是爬虫spider中yield过来的item
- 可以在setting中设置pipeline的配置,pipeline和pipeline的权重,权重越小优先级越高
动手操作可能要等到下一篇了,刚刚试了一下还是报错了...真的心好累,没人带真的好累啊