Scrapy知识点总结(1)

Scrapy知识点总结(1)

一.最基础最常见操作

A:无深度的简单爬取(url有规律型)

1:创建项目

(xx代表随机,根据项目而定,下面的所有xx都不一定是相同的)

scrapy start project XX
cd XX
scrapy genspider xx xx.com

2: 进入spiders\xx,进行对XXSpider略微修改

XXSpider类中的变量含义

名称 含义
name 该爬虫项目的名称,类型str
start_urls 需要爬取得链接,类型list
allowed_domains 只允许list中的域名通行

XXSpider类中的方法含义

名称 含义
parse Request类爬取返回的结果

parse函数的第二个参数response最常用的几个方法

名称 含义
text 返回一个字符串类型的body(基于python3,python2返回的是unicode)
css 返回的是Selector(text)
xpath 返回的是Selector(text)

至于如何略微修改
如果在A.1创建项目符合标准的话,那么类成员nameallowed_domains是无需修改的。 只需要对start_urls进行改动。
Q:如何改?
A:我们需要爬取xx.com用户ID从1-50000的用户信息。其链接是有规律的。 https://bbs.xx.com/userInfo/{id} , 那么我们其实就可以通过列表生成器来生成这个start_urls

start_urls = ['https://bbs.xx.com/userInfo/{id}'.format(id=i)  for i in range(1,51)]

Q:到了parse函数,如何改?

A:这就使用上面介绍的parse函数的第二个参数response最常用的几个方法中有三个response.text|css|xpath其中之一进行修改就好。根据需求拿到需要的数据。

这边parse的修改暂时告一段落, 因为到后面还要回来改。

3:修改items.py文件

这边就比较简单了,直接修改CrawlItem,类有一个参数。item 类型是dict(跟进源码3层可知)。
比如我们此时需要id,name,tel三个字段。代码就可以如下图所示:
(默认的Item可能是scrapy.Item,Field同理。自己修改下导包形式就好了。从import scrapy.Itemimport scrapy.Field -> from scrapy import Item,Field

class XXItem(Item):
    # define the fields for your item here like:
    id = Field()
    name = Field()
    tel = Field()
    pass

4:回头修改XXSpider的parse

我们爬取了数据,那么必须是要使用的。 所以呢,我们上面的items.py文件其实就是为我们这个进行一个准备。 已知我们需要id,name,tel.此时我们导入items.py的XXItem类 方式:from ..items import XXItem.
于是就可以写出下面的代码,至于关键信息的处理方式,依然看实际情况及个人喜好而定。无是非对错!

html = response.body.decode('utf-8')

pattern = re.compile('(.*?).*?target="_blank" rel="noopener noreferrer">(.*?)',re.S)
for item in re.findall(pattern,html):
    print(item)
    it = CrawlItem()
    it['id'] = item[0]
    it['title'] = item[1]
    it['author'] = item[2]
    yield it

此时我们上面的it会传到pipelines文件中的XXPipeline类的process_item方法。

5.存储文件

在第四点说到了it的内容会传到XXPipeline类的process_item方法。那么我们只需要对process_item文件进行文件读写/数据库操作等你认为有意义的操作即可。
此时务必不要忘记了,在setting.py文件中的ITEM_PIPELINES取消注释。该步骤忘记了会导致无法存储数据。

ITEM_PIPELINES = {
    'XX.pipelines.XXPipeline': 300,
}

这里丢上一张scrapy框架流程图,官方文档最新的
_PIPELINES = {
‘XX.pipelines.XXPipeline’: 300,
}

这里丢上一张scrapy框架流程图,官方文档最新的

你可能感兴趣的:(python)