scrapy的进一步学习

2022-09-20 19:44:00 浏览数 (1)

重新学习scrapy.

没几篇靠谱的文章.我就不信了,看着看着总能学会的.

什么是scrapy

scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,我们只需要实现少量的代码,就可以快速的抓取.

scrapy使用了twisted(异步)网络框架,可以加快我们的下载速度,而且包含了各种中间件接口,可以灵活的完成各种需求.

看一下各个部分的作用:

Scrapy运行流程大概如下:

  1. 引擎从调度器中取出一个链接(URL)用于接下来的抓取
  2. 引擎把URL封装成一个请求(Request)传给下载器
  3. 下载器把资源下载下来,并封装成应答包(Response)
  4. 爬虫解析Response
  5. 解析出实体(Item),则交给实体管道进行进一步的处理
  6. 解析出的是链接(URL),则把URL交给调度器等待抓取.

我们要做的:

  1. 新建项目 :scrapy startproject 项目名
  2. cd 项目文件夹
  3. 新建爬虫文件 :scrapy genspider 文件名 域名
  4. 明确目标(items.py)
  5. 写爬虫程序(文件名.py)
  6. 管道文件(pipelines.py)
  7. 全局配置(settings.py)
  8. 运行爬虫 :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的权重,权重越小优先级越高

动手操作可能要等到下一篇了,刚刚试了一下还是报错了...真的心好累,没人带真的好累啊

0 人点赞