目录
一、Scrapy框架简介
Scrapy 是一个快速高级的 Web 抓取和网页抓取框架,用于爬取网站并从页面中提取结构化的数据。它使用 Python 编写。Scrapy 提供了强大的工具来处理下载、解析、存储数据等操作,并且非常适合进行大规模的网络爬虫开发。
二、入门
(一) 安装
基于命令行安装
pip install scrapy
如果速度很慢的可以更换一下镜像源
(二) 基本使用
- 创建项目
scrapy startproject myproject
- 生成爬虫
- 在当前目录下输入命令,将在myproject/spider目录下创建一个名为demo的爬虫文件,并指定爬取域的范围
scrapy genspider demo "piao.qunar.com"
- 数据处理
先在items.py文件中定义你希望爬取的数据结构,然后通过pipeline.py文件定义数据的处理逻辑
- 项目参数设置
在setting文件中可以设置项目的配置,比如请求头、延迟请求时间、管道存储等等
- 爬虫
在生成的demo文件中进行数据爬取
- 运行
- demo:爬虫文件,也就是前面步骤2生成的文件
scrapy crawl demo
三、案例实战
来到案例实战,也是爬虫入门必爬的网站:豆瓣,爬取的内容是豆瓣Top250的电影数据
1. 首先创建项目
scrapy startproject movie
2. 生成爬虫
注意我们需要的只是豆瓣的域名,而不是豆瓣网的完整网址
scrapy genspider douban "movie.douban.com"
3. 数据处理
定义我们要保存的数据结构,再通过pipelines文件进行简单处理
import scrapy
class MovieItem(scrapy.Item):
rank = scrapy.Field() # 电影排名
name = scrapy.Field() # 电影名称
introduction = scrapy.Field() # 电影简介
rating = scrapy.Field() # 电影评分
comment_total = scrapy.Field() # 评论人数
from .items import MovieItem
import csv
class MoviePipeline:
def __init__(self):
# 当爬虫开始时调用,打开文件准备写入
self.file = open('豆瓣Top250电影数据.csv', 'w', newline='', encoding='utf-8')
self.writer = csv.writer(self.file)
# 写入表头
self.writer.writerow(['rank', 'name', 'introduction', 'rating', 'comment_total'])
def open_spider(self, spider):
print('开始爬虫...')
def process_item(self, item: MovieItem, spider):
# 处理评论人数字段数据 爬取到的数据 279300人评价 => 希望的数据 279300
item['comment_total'] = item['comment_total'][:-3]
# 对每个Item调用,将Item写入CSV文件
self.writer.writerow((item['rank'], item['name'], item['introduction'],
item['rating'], item['comment_total']))
# 不要忘记返回item,否则后续的pipeline将不会接收到这个item
return item
def close_spider(self, spider):
print("爬虫结束....")
4. 配置Scrapy爬虫参数
在settings.py文件中配置项目的各种设置,比如请求头、请求头、中间件、管道等。
# ITEM_PIPELINES是一个字典,键是Pipeline类的路径(从项目根目录开始),值是该Pipeline的优先级(数字越小,优先级越高)
ITEM_PIPELINES = {
"movie.pipelines.MoviePipeline": 300,
}
# 请求头
USER_AGENT = ""
5. 爬虫
在生成的文件中编写爬虫的代码逻辑,start_urls就是我们要爬取的网页,在parse函数中通过Xpath解析网页信息,拿到我们需要的字段数据,这里Xpath的具体用法不做具体讲解,不懂的可以详查。
import scrapy
from scrapy import Selector, Request
from ..items import MovieItem
class DoubanSpider(scrapy.Spider):
name = "douban"
allowed_domains = ["movie.douban.com"]
start_urls = ['https://movie.douban.com/top250']
def parse(self, response):
sel = Selector(response)
movie_items = sel.xpath('//div[@class="article"]//ol[@class="grid_view"]/li')
for movie in movie_items:
item = MovieItem()
item['rank'] = movie.xpath('.//div[@class="pic"]/em/text()').extract_first() # 电影排名
name = movie.xpath('.//div[@class="hd"]//span[1]/text()').extract_first() # 电影名称
item['name'] = name
item['introduction'] = movie.xpath('.//div[@class="bd"]//span[@class="inq"]/text()').get() # 电影简介
item['rating'] = movie.xpath('.//div[@class="star"]/span[2]/text()').extract_first() # 电影评分
item['comment_total'] = movie.xpath('.//div[@class="star"]/span[4]/text()').extract_first() # 评价人数
print("正在爬取 %s 电影数据" % name)
yield item
nextLink = sel.xpath('//span[@class="next"]/link/@href').extract()
if nextLink:
next_page_url = nextLink[0]
yield Request(url=response.urljoin(next_page_url), callback=self.parse)
6. 运行爬虫
打开控制台,输入命令,开启爬虫
scrapy crawl douban
在爬取完成之后,会在项目的根目录下生成我们设置的存储文件,里面就是我们所爬取到的数据
四、总结
当然,这只是Scrapy的入门,Scrapy框架功能非常强大,感兴趣的朋友也可以详细了解了解,这里这是给大家入门玩玩,但是爬虫也要注意网站规则!!!