突破%

 

python爬虫之scrapy框架

爬虫框架

Baidu # 项目文件夹
├── Baidu # 用来装载项目文件的目录
│ ├── items.py # 定义要抓取的数据结构
│ ├── middlewares.py # 中间件,用来设置一些处理规则
│ ├── pipelines.py # 管道文件,处理抓取的数据
│ ├── settings.py # 全局配置文件
│ └── spiders # 用来装载爬虫文件的目录
│ ├── baidu.py # 具体的爬虫程序
└── scrapy.cfg # 项目基本配置文件

框架

1、安装:pip install Scrapy

2、新建项目:scrapy startproject 项目名

3、爬虫流程
Engine(引擎) 整个 Scrapy 框架的核心,主要负责数据和信号在不同模块间传递。
Scheduler(调度器) 用来维护引擎发送过来的 request 请求队列。
Downloader(下载器) 接收引擎发送过来的 request 请求,并生成请求的响应对象,将响应结果返回给引擎。
Spider(爬虫程序) 处理引擎发送过来的 response, 主要用来解析、提取数据和获取需要跟进的二级URL,然后将这些数据交回给引擎。
Pipeline(项目管道) 用实现数据存储,对引擎发送过来的数据进一步处理,比如存 MySQL 数据库等。
在整个执行过程中,还涉及到两个 middlewares 中间件,分别是下载器中间件(Downloader Middlewares)和蜘蛛中间件(Spider Middlewares),它们分别承担着不同的作用:
下载器中间件,位于引擎和下载器之间,主要用来包装 request 请求头,比如 UersAgent、Cookies 和代理 IP 等
蜘蛛中间件,位于引擎与爬虫文件之间,它主要用来修改响应对象的属性。

第一步:由“引擎”向爬虫文件索要第一个待爬取的 URL,并将其交给调度器加入 URL 队列当中(对应图中1/2步骤)。
第二步:调度器处理完请求后, 将第一个 URL 出队列返回给引擎;引擎经由下载器中间件将该 URL 交给下载器去下载 response 对象(对应3/4步骤)。
第三步:下载器得到响应对象后,将响应结果交给引擎,引擎收到后,经由蜘蛛中间件将响应结果交给爬虫文件(对应5/6步骤)。
第四步:爬虫文件对响应结果进行处理、分析,并提取出所需要的数据。
第五步:最后,提取的数据会交给管道文件去存数据库,同时将需要继续跟进的二级页面 URL 交给调度器去入队列(对应7/8/9步骤)。

4、settings配置文件

1、定义User-Agent

USER_AGENT = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)'

2、是否遵循robots协议,一般设置为False

ROBOTSTXT_OBEY = False

3、最大并发量,默认为16

CONCURRENT_REQUESTS = 32

4、下载延迟时间

DOWNLOAD_DELAY = 1
其余常用配置项介绍:

设置日志级别,DEBUG < INFO < WARNING < ERROR < CRITICAL

LOG_LEVEL = ' '

将日志信息保存日志文件中,而不在终端输出

LOG_FILE = ''

设置导出数据的编码格式(主要针对于json文件)

FEED_EXPORT_ENCODING = ''

非结构化数据的存储路径

IMAGES_STORE = '路径'

请求头,此处可以添加User-Agent、cookies、referer等

DEFAULT_REQUEST_HEADERS={
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8',
'Accept-Language': 'en',
}

项目管道,300 代表激活的优先级 越小越优先,取值1到1000

ITEM_PIPELINES={
'Baidu.pipelines.BaiduPipeline':300
}

添加下载器中间件

DOWNLOADER_MIDDLEWARES = {}

创建项目
在 CMD 命令行执行以下命令创建项目以及爬虫文件:

创建项目

  1. scrapy startproject Title

进入项目

  1. cd Title

创建爬虫文件

3)scrapy genspider title c.biancheng.net

猫眼电影案例
最后,我们使用 Scrapy 框架完成一个完整的案例:抓取猫眼电影 Top100 榜。

  1. 创建项目
    scrapy startproject Maoyan100

进入项目目录

cd Maoyan100

创建爬虫文件,注意url 一定要是网站域名

scrapy genspider maoyan www.maoyan.com
2) 定义数据结构
首先在 items.py 中定义要抓取的数据结构,如下所示:
name = scrapy.Field()
star = scrapy.Field()
time = scrapy.Field()
3) 编写爬虫文件
接下来编写爬虫文件 maoyan.py 代码如下所示:
import scrapy
from Maoyan100.items import Maoyan100Item
class Maoyan100Spider(scrapy.Spider):
# name 指定爬虫文件名字
name = 'maoyan'
allowed_domains = ['maoyan.com'] # 网站域名
start_urls = ['https://maoyan.com/board/4?offset=0'] # 第一个要抓取的url
offset = 0 #查询字符串参数
# response 为 start_urls中影响对象
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)
4) 实现数据存储
通过编写管道文件 pipelinse.py 文件实现数据的存储,将抓取的数据存放在 MySQL 数据库,这里需要提前建库、建表,因为前面章节已经创建过,此处不再赘述。代码编写如下:
import pymysql
from Maoyan100.settings import *
class Maoyan100Pipeline(object):
def process_item(self, item, spider):
print(item['name'], item['star'], item['time'])
return item # 多个管道有体现

存入mysql数据库的管道

class Maoyan100MysqlPipeline(object):
#开始
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) 定义启动文件
下面定义项目启动文件 run.py, 代码如下:
from scrapy import cmdline

执行爬虫文件 -o 指定输出文件的格式

cmdline.execute('scrapy crawl maoyan -o maoyan.csv'.split()) #执行项目,并且将数据存csv文件格式
注意:指定 -o 参数,可以将数据以特定的文件格式保存,比如 csv、txt、josn 等。

  1. 修改配置文件
    最后修改配置文件,主要有修改以下内容:添加日志输出、激活管道 pipelines、定义数据库常量,以及其他一些常用选项,如下所示:

设置 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'

posted on 2022-06-21 01:05  突破%  阅读(28)  评论(0)    收藏  举报

导航