爬虫系列总目录
Scrapy框架的简单使用
Scrapy是用纯 Python 实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。安装命令 pip install scrapy
- scrapy基于事件的机制,异步存储方式极大的提高了爬虫的效率
- 配置简单,通过简单代码实现复杂爬虫
一、 常用命令
1.1. 全局命令
# 查看帮助(全部命令以及其描述)
scrapy --help
# 创建一个新的Scrapy项目(项目名不可以以数字开头)
scrapy startproject <project_name>
# 在当前文件夹或者当前项目,创建一个新的爬虫文件
scrapy genspider example example.com
# 运行一个爬虫文件
scrapy runspider spider_name.py
# 获取指定的URL,并且能够显示出获取的过程
scrapy fetch url
# 在浏览器中打开指定的URL
scrapy view url
# 查看Scrapy版本 参数-v会将关联模块一并输出
scrapy version [-v]
1.2 项目命令
# 运行爬虫项目
scrapy crawl xbqg(脚本名称)
# 测试本地硬件性能
scrapy bench
# 列出当前项目下的所有爬虫文件
scrapy list
二、 创建项目文件
2.1 创建项目
scrapy startproject biquge
2.2 创建爬虫文件
cd biquge
# 创建scrapy爬虫文件
scrapy genspider xbqg www.xbiquge.la
三、 Scrapy核心架构
3.1 按功能划分
3.2 工作流程图
3.3 按文件介绍
---- scrapy.cfg 配置文件
---- 项目文件
---- ---- spiders 爬虫文件夹 爬虫代码文件
---- ---- pipelines.py 管道,将 item 字段文件中的字段进行持久化等操作
---- ---- setting 配置文件
四、 运行程序
4.1 爬虫脚本编写
- response.xpath()利用xpath解析数据
- extract() 返回一个包含有字符串的列表
- extract_first() 返回列表中的第一个字符串,列表为空没有返回None
spider 文件夹内文件 xbqg.py
class XbqgSpider(scrapy.Spider):
# 爬虫名必须唯一
name = 'xbqg'
# 允许的域名
allowed_domains = ['www.xbiquge.la']
# 开始采集的url
start_urls = ['https://www.xbiquge.la/10/10489/']
def parse(self, response):
all_dd = response.xpath('//dl/dd')
for dd in all_dd[1:11]:
url = 'https://www.xbiquge.la'+dd.xpath('./a/@href').extract()[0]
# 再次根据生成的url来调用callback参数后面的方法
yield scrapy.Request(url=url, callback=self.parse_next)
def parse_next(self, response):
item = BiqugeItem()
item['name'] = response.xpath("//div[@class='bookname']/h1/text()").extract()[0].replace(' ', '')
item['content'] = ''.join(response.xpath("//*[@id='content']/text()").extract()).replace(u' ', '')
yield item
4.2 基于管道的持久化
- 在items.py文件中进行定义相关持久化属性
- 在爬虫文件中将解析的数据存储到Item类型对象中
- 将Items类型对象提交给管道
- 在管道文件中,接受爬虫文件提交过来的Items类型
- 对持久化数据进行自定义形式存储
- 在配置文件中打开管道机制: ITEM_PIPELINES
items
# item的本质是字典
class BiqugeItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
# 章节名字
name = scrapy.Field()
# 章节内容
content = scrapy.Field()
Pipelines
class BiqugePipeline:
def process_item(self, item, spider):
self.t = open('./book/{}.txt'.format(item['name']), 'w', encoding='utf-8')
self.t.write(item['content'])
return item
def close_spider(self, spider):
self.t.close()
4.3 修改Settings 设置
# Obey robots.txt rules
# 是否遵守robot协议
ROBOTSTXT_OBEY = False
BOT_NAME = 'biquge'
SPIDER_MODULES = ['biquge.spiders']
NEWSPIDER_MODULE = 'biquge.spiders'
#增加请求头User-Agent 防止反爬
DEFAULT_REQUEST_HEADERS = {}
# 分配给每个类的整型值,确定了他们运行的顺序,item 按数字从低到高的顺序,通过pipeline,
# 通常将这些数字 定义在0-1000范围内(0-1000随意设置,数值越低,组件 的优先级越高)
ITEM_PIPELINES = {
'biquge.pipelines.BiqugePipeline': 300,
}
使用命令行启动 scrapy crawl xbqg
4.4 从main 函数启动()
创建main.py 文件, 跟scrapy.cfg 在同一层级下。也是命令行。在pycharm中从main启动可以实现debug。
from scrapy import cmdline
cmdline.execute('scrapy crawl xbqg'.split())
4.5 终端命令的数据持久化存储
# csv格式
scrapy crawl xbqg -o meiju.csv
# json格式,默认为Unicode编码
scrapy crawl xbqg -o meiju.json
# json lines格式,默认为Unicode编码
scrapy crawl xbqg -o meiju.jsonl
# xml格式
scrapy crawl xbqg -o meiju.xml