1. Scrapy简介
Scrapy 是一个基于 Twisted 实现的异步处理爬虫框架,用纯 Python 语言编写的,为了爬取网站数据、提取结构性数据。
注:Twisted 是一个基于事件驱动的异步网络引擎框架,同样采用 Python 实现。
Scrapy 常应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
用户只需要定制几个模块就可以实现一个爬虫,用来抓取网页内容以及各种图片。
2. 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,并进行进行后期处理(详细分析、过滤、存储等)的地方。
Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。
Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)
3. Scrapy安装
pip install --upgrade pip
pip install Scrapy
注:当pip的版本太低或者有问题可能会报错
4.Scrapy常用命令
命令 | 格式 | 说明 |
startproject | scrapy startproject <项目名> | 创建一个新项目。 |
genspider | scrapy genspider <爬虫文件名> <域名> | 新建爬虫文件。 |
runspider | scrapy runspider <爬虫文件> | 运行一个爬虫文件,不需要创建项目。 |
crawl | scrapy crawl <spidername> | 运行一个爬虫项目,必须要创建项目。 |
list | scrapy list | 列出项目中所有爬虫文件。 |
view | scrapy view <url地址> | 从浏览器中打开 url 地址。 |
shell | csrapy shell <url地址> | 命令行交互模式。 |
settings | scrapy settings | 查看当前项目的配置信息。 |
5.创建Scrapy项目
新建项目 (scrapy startproject xxx命令):新建一个新的爬虫项目
明确目标 (编写items.py):明确你想要抓取的目标
制作爬虫 (spiders/xxspider.py):制作爬虫开始爬取网页
存储内容 (pipelines.py):设计管道存储爬取内容
5.1 新建项目
在cmd中切换到想要创建文件的盘符(cd xxx)
新建项目(scrapy startproject example)
进入项目(cd example)
创建爬虫程序(scrapy genspider maoyan www.maoyan.com)
文件结构:
example/
scrapy.cfg
example/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
maoyan.py
5.2 明确目标
在 items.py 中定义要抓取的数据结构
class ExampleItem(scrapy.Item):
name = scrapy.Field()
star = scrapy.Field()
time = scrapy.Field()
5.3修改解析模块
在pycharm中打开example项目
修改maoyan.py中的起始url(start_urls)
将解析函数写入parse函数中
示例:
def parse(self,response):
# 基准xpath,匹配电影信息的dd节点对象列表
dd_list = response.xpath('//dl[@class="board-wrapper"]/dd')
# 给items.py 中的类:Maoyan100Item()实例化
item = Maoyan100Item()
for dd in dd_list:
item['name'] = dd.xpath('./a/@title').get().strip() # 1.6以后版本使用 原来用 extract_first()
item['star'] = dd.xpath('.//p[@class="star"]/text()').get().strip()
item['time'] = dd.xpath('.//p[@class="releasetime"]/text()').get().strip()
yield item
if self.offset < 90: # 判断条件
self.offset += 10
url = 'https://maoyan.com/board/4?offset=' + str(self.offset)
# 把url交给secheduer入队列
# response会自动传给 callback 回调的 parse()函数
#Scrapy.request()向url发起请求,并将响应结果交给回调的解析函数
yield scrapy.Request(url=url, callback=self.parse)
5.4 数据存储
通过编写管道文件 pipelinse.py 文件实现数据的存储
import pymysql
#开始
def open_spider(self, spider):
# 爬虫项目启动,执行连接数据操作
# 以下常量需要定义在settings配置文件中
self.db = pymysql.connect(
host=MYSQL_HOST,
user=MYSQL_USER,
password=MYSQL_PWD,
database=MYSQL_DB,
charset=MYSQL_CHARSET
)
self.cursor = self.db.cursor()
# 向表中插入数据
def process_item(self, item, spider):
ins = 'insert into movieinfo values(%s,%s,%s)'
L = [
item['name'], item['star'], item['time']
]
self.cursor.execute(ins, L)
self.db.commit()
return item
# 结束存放数据,在项目最后一步执行
def close_spider(self, spider):
# close_spider()函数只在所有数据抓取完毕后执行一次,
self.cursor.close()
self.db.close()
print('执行了close_spider方法,项目已经关闭')
5.5配置文件
最后修改配置文件setting.py,主要有修改以下内容:添加日志输出、激活管道 pipelines、定义数据库常量,以及其他一些常用选项
参数 | 含义 |
DOWNLOAD_DELAY = 0.5 | 下载延迟 |
DOWNLOADER_MIDDLEWARES= { # 这里的优先级不能相同 ‘crawler.middlewares.my_useragent’: 544,} | 添加自己定义的伪装规则 |
ITEM_PIPELINES= { ‘crawler.pipelines.CrawlerPipeline’: 300,} | 一定要开启pipeline |
#设置 robots.txt 为False
ROBOTSTXT_OBEY = False
#设置日志级别: DEBUG < INFO < WARNING < ERROR < CRITICAL
#日志需要自己添加,配置文件中没有,在空白处添加即可
LOG_LEVEL='DEBUG'
#定义日志输出文件
LOG_FILE='maoyan.log'
#设置导出数据的编码格式
FEED_EXPORT_ENCODING='utf-8'
#设置下载器延迟时间,秒为单位
DOWNLOAD_DELAY = 1
#请求头,添加useragent等信息
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1'
}
#激活管道,并添加数据存放mysql的类,200为执行优先级
ITEM_PIPELINES = {
'Maoyan100.pipelines.Maoyan100Pipeline': 300,
# 执行数据存储mysql
'Maoyan100.pipelines.Maoyan100MysqlPipeline': 200
}
#在配置文件末尾添加mysql常用变量
MYSQL_HOST='localhost'
MYSQL_USER='root'
MYSQL_PWD='123456'
MYSQL_DB='maoyandb'
MYSQL_CHARSET='utf8'
5.6启动文件
定义项目启动文件run.py
from scrapy import cmdline
#执行爬虫文件 -o 指定输出文件的格式
cmdline.execute('scrapy crawl maoyan -o maoyan.csv'.split()) #执行项目,并且将数据存csv文件格式