Scrapy框架介绍
Scrapy框架是一种快速开发爬虫的框架,只需要书写少量代码就能实现爬虫效果。
优势
- 减少了重复的代码量
- 开发效率提高
Scrapy的组件
- spider文件夹:存储爬虫,爬虫之间具有独立的名称
- init.py:初始化文件
- setting.py:配置文件,设置爬虫的配置
- middlewares.py:中间件文件,用于拦截请求,配置中间件的连接,如设置cookie、UserAgent、Ip等
- pipelines.py:管道文件,用于将数据持久化
- item.py:类文件,用于设置需要获取的元素实体的属性
使用Scrapy框架进行开发
爬取豆瓣网站
在python的环境下,使用pip安装Scrapy,打开处于开发的目录下的命令行
pip install Scrapy
安装完成后,创建爬虫项目,项目名可自定义,此处为douban_scrapy
scrapy startproject douban_scrapy
创建完成后进入生成的爬虫目录
cd douban_scrapy
进入爬虫目录后,创建爬虫,爬虫的名字可自定义,此处为douban,爬虫名字后跟着的是所要爬取的目标网站,可自定义
scrapy genspider douban https://movie.douban.com/top250
创建完爬虫后,可在spider文件夹中看到我们刚创建的爬虫,然后打开爬虫目录下的setting.py文件设置爬虫的配置,在此文件中加入下列代码
配置日志级别
LOG_LEVEL="WARNING"
配置代理,伪装爬虫,UserAgent可从浏览器的开发者工具中获取,不一定要与下方一样
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.200"
遵守网站本地的规则
ROBOTSTXT_OBEY = True
最大请求线
CONCURRENT_REQUESTS = 8
延迟请求,避免因请求频繁ip被封
DOWNLOAD_DELAY = 3
配置完爬虫信息后,打开item.py文件,创建所要爬取的类
import scrapy
class MovieItem(scrapy.Item):
title = scrapy.Field()
rank = scrapy.Field()
subject = scrapy.Field()
打开刚刚创建的爬虫文件(douban.py),修改parse方法
# 记住要用这个方式导入类
from ..items import MovieItem
(此方法用于解析得到的html文件)
def parse(self, response):
sel = scrapy.Selector(response)
list_items = sel.css('#content > div > div.article > ol > li')
for list_item in list_items:
movie_item = MovieItem()
movie_item['title'] = list_item.css('span.title::text').extract_first()
movie_item['rank'] = list_item.css('span.rating_num::text').extract_first()
movie_item['subject'] = list_item.css('span.inq::text').extract_first()
yield movie_item
打开pipelines.py文件,配置持久化信息:
方式一:以excel形式保存
安装Excel库
pip install openpyxl
配置Excel管道类
class ExcelPipeline:
def __init__(self):
self.wb = openpyxl.Workbook()
self.ws = self.wb.active
self.ws.title = 'Top'
self.ws.append(('标题', '评分', '主题'))
def close_spider(self, spider):
self.wb.save('电影数据.xlsx')
def process_item(self, item, spider):
title = item.get('title', '')
rank = item.get('rank', '')
subject = item.get('subject', '')
self.ws.append((title, rank, subject))
return item
方式二:以mysql数据库形式保存
安装mysql数据库
pip install pymysql
构建mysql数据库的管道类
class MysqlPipeline:
def __init__(self):
self.conn = pymysql.connect(host='127.0.0.1', port=3306, user='root',
password='1234', database='spider', charset='utf8mb4')
self.cursor = self.conn.cursor()
self.data = []
def close_spider(self, spider):
if len(self.data) > 0:
self.__write_to_DB()
self.conn.close()
def process_item(self, item, spider):
title = item.get('title', '')
rank = item.get('rank', 0)
subject = item.get('subject', '')
self.data.append((title, rank, subject))
if len(self.data) == 100:
self.__write_to_DB()
self.data.clear()
return item
def __write_to_DB(self):
self.cursor.executemany(
'insert into tb_douban_movie(title, rating, subject) values (%s,%s,%s)',
self.data
)
self.conn.commit()
经过上述两种配置后,再次打开setting.py文件,配置管道类的信息
ITEM_PIPELINES = {
# 设置管道类的优先级,数值越小优先级越高
"douban_scrapy.pipelines.ExcelPipeline": 300,
"douban_scrapy.pipelines.MysqlPipeline": 200,
}
打开命令行,重新进入到我们的爬虫目录
cd douban_scrapy
启动爬虫,得到一个名为电影数据的excel文件/查看数据库发现数据,完成爬取
scrapy scrawl douban