使用Scrapy框架进行爬虫开发

Scrapy框架介绍

Scrapy框架是一种快速开发爬虫的框架,只需要书写少量代码就能实现爬虫效果。

优势

  1. 减少了重复的代码量
  2. 开发效率提高

Scrapy的组件

  1. spider文件夹:存储爬虫,爬虫之间具有独立的名称
  2. init.py:初始化文件
  3. setting.py:配置文件,设置爬虫的配置
  4. middlewares.py:中间件文件,用于拦截请求,配置中间件的连接,如设置cookie、UserAgent、Ip等
  5. pipelines.py:管道文件,用于将数据持久化
  6. 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

猜你喜欢

转载自blog.csdn.net/cleverstronge/article/details/132270269