Python3爬虫-Scrapy笔记1

Scrapy介绍

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

Scrapy工作流程

Scrapy工作流程

内容作用实现者
Scrapy Engine(引擎)总指挥:负责数据和信号在不同的模块之间传递Scrapy
Scheduler(调度器)一个队列,存放引擎发过来的request请求Scrapy
Downloader(下载器)把下载的引擎发过来的request请求,并返回给引擎Scrapy
Spider(爬虫)处理引擎发过来的response,提取数据,提取url,并交还给引擎开发者
Item Pipeline(管道)处理引擎传递过来的数据,比如存储开发者
Downloader Middlewares(下载中间件)可以自定义的下载扩展,比如设置代理按需求开发
Spider MiddlewaresSpider(中间件)可以自定义request请求进行response过滤按需求开发
  1. 调度器从待下载的URL中取出一个URL
  2. 调度器启动采集模块Spiders模块
  3. 采集模块把URL传给下载器,下载器把资下载下来自动处理编码
  4. 提取目标数据,抽取出目标对象,由管道进行进一步的处理;比如存入数据库,文本
  5. 若是解析出的是URL,则把URL插入到待爬取队列当中

Mac安装Scrapy

1
2
xcode-select --install
pip install scrapy

简单教程

创建工程

1
2
# scrapy startproject 项目名
scrapy startproject scrapy_test

目录说明结构:

  • scrapy.cfg 项目的配置信息,主要为Scrapy命令行工具提供一个基础的配置信息。
  • items.py 设置数据存储模板,用于结构化数据
  • pipelines.py 数据处理行为 一般结构化的数据持久化
  • settings.py 配置文件
  • spiders 爬虫目录 创建文件,编写爬虫规则
  • middlewares.py 爬取过程中的中间件文件

创建爬虫程序

  1. 创建工程
  2. 定义Item,构造爬取的对象(可选)
  3. 编写Spider,爬虫主体
  4. 编写配置和Pipeline,用于处理爬取的结果(可选)
  5. 执行爬虫

Spider: 定义爬取的动作以及分析某个网页的地方。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 进入项目同名的目录
cd scrapy_test
# 格式: scrapy genspider 爬虫名称 爬取的域名
scrapy genspider quotes quotes.toscrape.com

#生成的文件 quotes.py
import scrapy

class QuotesSpider(scrapy.Spider):
name = 'quotes' #爬虫的名字
allowed_domains = ['quotes.toscrape.com'] #允许爬取的范围
start_urls = ['http://quotes.toscrape.com/'] #爬取的第一个页面

# 解析网页内容 对内容做处理
def parse(self, response): #处理start_urls对应的响应
pass

定义数据结构

编辑items.py,增加数据结构

1
2
3
4
class QuotesItem(scrapy.Item):
text = scrapy.Field()
author = scrapy.Field()
tags = scrapy.Field()

编写爬虫代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#使用css
class QuotesSpider(scrapy.Spider):
name = 'quotes'
allowed_domains = ['quotes.toscrape.com']
start_urls = ['http://quotes.toscrape.com/']

def parse(self, response):
# print(response.text)
quotes = response.css('.quote')
for quote in quotes:
item = QuotesItem()
text = quote.css('.text::text').extract_first() # 获取匹配的第一个
author = quote.css('.author::text').extract_first()
tags = quote.css('.tags .tag::text').extract() # 获取匹配的所有
item['text'] = text
item['author'] = author
item['tags'] = tags
yield item

next = response.css('.pager .next a::attr(href)').extract_first()
url = response.urljoin(next)
yield scrapy.Request(url=url, callback=self.parse)

#使用xpath
class ItcastSpider(scrapy.Spider):
name = 'itcast'
allowed_domains = ['itcast.cn']
start_urls = ['http://www.itcast.cn/channel/teacher.shtml']

def parse(self, response):
h3s = response.xpath('//div[@class="li_txt"]//h3/text()').extract()
for index,h3 in enumerate(h3s):
item = {}
item['name'] = h3
item['index'] = index
yield item
# print(h3)

常用指令

1
2
3
4
5
#调试命令
scrapy shell 网站
#运行爬虫
# scrapy crawl 爬虫名称
scrapy crawl quotes

settings.py 设置

1
2
3
4
5
6
7
#设置日志等级
LOG_LEVEL = 'WARING'

#开启管道
ITEM_PIPELINES = {
'myscrapy.pipelines.MyscrapyPipeline': 300, #管道的路径 优先级
}