Python升级打怪—Scrapy零基础小白入门

391 阅读3分钟

一、Scrapy框架简介

Scrapy 是一个快速高级的 Web 抓取网页抓取框架,用于爬取网站并从页面中提取结构化的数据。它使用 Python 编写。Scrapy 提供了强大的工具来处理下载、解析、存储数据等操作,并且非常适合进行大规模的网络爬虫开发。

二、入门

(一) 安装

基于命令行安装

pip install scrapy

如果速度很慢的可以更换一下镜像源

(二) 基本使用

  1. 创建项目
scrapy startproject myproject
  1. 生成爬虫
  • 在当前目录下输入命令,将在myproject/spider目录下创建一个名为demo的爬虫文件,并指定爬取域的范围
scrapy genspider demo "piao.qunar.com"
  1. 数据处理
先在items.py文件中定义你希望爬取的数据结构,然后通过pipeline.py文件定义数据的处理逻辑
  1. 项目参数设置
在setting文件中可以设置项目的配置,比如请求头、延迟请求时间、管道存储等等
  1. 爬虫
在生成的demo文件中进行数据爬取
  1. 运行
  • 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框架功能非常强大,感兴趣的朋友也可以详细了解了解,这里这是给大家入门玩玩,但是爬虫也要注意网站规则!!!