一.框架介绍
1.scrapy框架由五个部分组成:
-
Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等
-
Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎.
-
Downloader(下载器): 负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理.
-
Spider(爬虫): 它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器).
-
Item Pipeline(管道): 它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方.
2.框架示意图
二. 框架使用
基本使用流程:
1.创建项目:scrapy startproject 项目名称
2.新建爬虫:scrapy genspider 爬虫文件名 爬虫基础域名
3.编写item
4.spider最后return item
5.在setting中修改pipeline配置
6.在对应pipeline中进行数据持久化操作
1.安装
pip install scrapy
pip install scrapy -i https://pypi.douban.com/simple 使用网络上的资源安装
可能遇到失败:
building 'twisted.test.raiser' extension
error:Microsoft Visual c++ 14.0 is required. Get it with "Microsoft Visual c++ Build tools": ......等字样的错误
此时需先安装文件 Twisted-19.2.0-cp36-cp36m-win_amd64.whl ,需从网络下载到本地, 下载链接: https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted 在该文件目录下运行命令:
pip install Twisted-19.2.0-cp36-cp36m-win_amd64.whl
再执行 pip install scrapy 进行安装.
2.基本使用
2.1 通过指令创建项目
scrapy startproject reading_network(项目名)
2.2 通过指令创建spider.py文件
命令:
cd reading_network(项目文件)
# 创建基础spider, using template 'basic'
scrapy genspider guoxue "www.dushu.com" # 生成爬虫文件taobao 后面接所要爬取的域名
# 创建crawlspider, using template 'crawl' # 设置rule, 可跟踪响应的url
scrapy genspider -t crawl guoxue www.dushu.com # 后面域名也可不加双引号, 但不能为单引号 ''
class GuoxueSpider(scrapy.Spider):
name = 'guoxue'
allowed_domains = ['www.dushu.com']
start_urls = ['https://www.dushu.com/book/1617.html']
def parse(self, response):
print(type(response))
detail_urls = response.xpath('//div[@class="book-info"]/h3/a/@href').extract()
name: 爬虫名,启动的时候根据爬虫的名字启动项目
allowed_domains:允许的域名,爬取的时候这个请求要不要发送,如果是该允许域名之下的url,就会发送,如果不是,则过滤掉这个请求,这是一个列表,可以写多个允许的域名
start_urls:爬虫起始url,是一个列表,里面可以写多个,一般只写一个
def parse(self, response): 就是以后写代码的地方,parse函数名是固定的,当收到下载数据的时候会自动的调用这个方法, 该方法第二个参数为response,这是一个响应对象,从该对象中获取html字符串,然后解析。
【注】这个parse函数必须返回一个可迭代对象
2.3 定制item.py
定义所需要爬取的字段, 非常简单,复制粘贴
name = scrapy.Field()
img_url = scrapy.Field()
......
2.4 开启爬虫
cmd命令:
scrapy crawl guoxue(爬虫文件名)
可以设置启动文件 start.py:
from scrapy import cmdline
cmdline.execute(['scrapy', 'crawl', 'guoxue'])
若报错:ModuleNotFoundError: No module named 'win32api'
可直接安装: pip install pywin32
或安装对应pywin32版本即可: 下载链接: https://sourceforge.net/projects/pywin32/
根据response 获取网页内容:
response.text 字符串类型
response.body 二进制类型
非常注意: 想要爬取到数据,需在settings文件中修改ROBOTSTXT_OBEY设置:
ROBOTSTXT_OBEY = False # 表示不遵守robots.txt 通用爬虫的规则
2.5 将爬取数据生成指定格式文件
需在运行命令后接参数:
scrapy crawl guoxue -o data.json # 编码问题 需在settings中添加 FEED_EXPORT_ENCODING = 'utf-8'
scrapy crawl guoxue -o data.xml
scrapy crawl guoxue -o data.csv
scrapy用-o filename.json 输出时,会默认使用unicode编码,当内容为中文时,输出的json文件不便于查看, 可以在setting.py文件中修改默认的输出编码方式,只需要在setting.py中增加如下语句(默认似乎是没有指定的,所以要增加,如果默认有,就直接修改)
2.6 将爬取数据存入数据库
-
settings.py中配置数据库:
DB_HOST = '127.0.0.1'
DB_PORT = 3306
DB_USER = 'root'
DB_PASSWORD = '450502'
DB_DATABASE = 'spider1'
DB_CHARSET = 'utf8'
-
settings.py中配置 ITEM_PIPELINES
ITEM_PIPELINES = { # 可以添加多个管道
# 数字越小优先级越高,越先执行 0-1000
'reading_network.pipelines.ReadingNetworkMysqlPipeline': 100,
'reading_network.pipelines.xxx': 200,
} -
在pipelines.py文件中自定义管道 ReadingNetworkMysqlPipeline
class ReadingNetworkMysqlPipeline(object): # 需添加到settings管道配置
# 开启爬虫时执行该函数
def open_spider(self,spider):
# 创建连接
settings = get_project_settings() # 封装好的获取配置文件settings的方法
host = settings.get('DB_HOST')
port = settings.get('DB_PORT')
user = settings.get('DB_USER')
password = settings.get('DB_PASSWORD')
database = settings.get('DB_DATABASE')
charset = settings.get('DB_CHARSET')
self.conn = pymysql.connect(host=host, port=port, user=user, password=password,
database=database, charset=charset)
self.cursor = self.conn.cursor()
# spider.py下的爬虫需不断返回item对象
def process_item(self, item, spider): # 注意位置参数顺序
data = dict(item)
keys = ', '.join(data.keys())
values = ', '.join(['%s'] * len(data)) # '%s, %s, %s'
sql = f'insert into guoxue({keys}) values({values})'
print(222)
try:
self.cursor.execute(sql, tuple(data.values())) # 传一个元组 替换 其中%s
self.conn.commit()
except Exception as e:
print(e)
self.conn.rollback()
return item
# 关闭爬虫时执行该函数
def close_spider(self, spider):
self.cursor.close()
self.conn.close()
2.7 日志文件配置
# 日志等级 用的是python原生的日志系统
LOG_LEVEL = 'ERROR' # 可以解决终端打印太多日志消息的问题, 只打印错误信息
LOG_FILE = './log.txt' # 指定路径
需要自己写日志输出方法
2.8 修改输出文件默认编码格式
settings.py添加 :
FEED_EXPORT_ENCODING = 'utf-8' # 默认utf-8
参考官方文档: 链接: http://doc.scrapy.org/en/latest/topics/item-pipeline.html