项目实战 | Python爬虫概述与实践(三)

2022-04-11 18:51:56 浏览数 (1)

前言

《项目实战 | python爬虫及实践(一)》中介绍了网络爬虫的定义、分类和基本流程。

《项目实战 | python爬虫及实践 (二)》中介绍了如何从服务器响应的HTML文档中解析提取想要的内容,主要包括BeautifulSoup方法和正则表达式方法。

在徒手写爬虫代码时,如果请求为一系列URL,我们需要维护URL队列,如果对速度还有要求的话,还那需要编写多线程代码,想想就脑阔疼。所以在python爬虫的第三篇文章,我们将介绍为解决这些问题而设计的爬虫框架——Scrapy,内容安排如下:

  • Scrapy是什么
  • Scrapy安装
  • Scrapy入门实例

一、Scrapy是什么

Scrapy是一个为了爬取网站数据、提取结构性数据而编写的应用框架,我们只需要编写少量的代码,就能够快速抓取。

1.架构图

2.运作流程

代码语言:javascript复制
Engine:Hi,Spider,你要处理哪一个网站?
Spider:我要处理xxx.com
Engine:给我第一个要处理的URL吧
Spider:给你,第一个(初始)URL是 xxx.com
Engine:Hi,Scheduler,我这有request请求,你帮我排序入队一下
Scheduler:好的,马上处理
Engine:Hi,Scheduler,把你处理好的request请求给我
Scheduler:给你,这是我处理好的request
Engine:Hi,Downloader,你按照Downloader Middlewares的设置帮我下载这个request请求
Downloader:好的,给你,这是下载好的东西。(如果失败:Sorry,这个request下载失败,然后Engine告诉Scheduler重新记录这个request,待会儿再下载)
Engine:Hi,Spider,这是下载好的东西,你自己处理一下
Spider:Hi,Engine,我这里有两个结果,一个是需要跟进的URL请求,另一个是获取的Item数据
Engine:Hi,Pipeline,我这有Item你帮我处理一下。Hi,Scheduler,这是需要跟进的URL你帮我处理一下
从第4步开始循环,直到Scheduler队列为空。

二、Scrapy安装

1.使用conda安装(如果已经安装anconada)

代码语言:javascript复制
conda install scrapy

2.使用pip安装

代码语言:javascript复制
pip install --upgrade pip      #升级pip版本
pip install Scrapy             #pip安装Scrapy框架
#根据命令行提示做下载安装

检测Scrapy安装是否成功,在终端输入scrapy回车,安装成功会出现以下内容

入门Scrapy常用命令主要包括:

代码语言:javascript复制
scrapy startproject projectname         #创建项目
scrapy genspider spidername domainname  #创建爬虫,限制爬行范围
scrapy crawl spidername                 #运行爬虫
scrapy crawl spidername -o file.json    #保存结果至file.json文件中

三、Scrapy入门实例

这个实例中,我们想爬取www.quotes.toscrape.com网站中的名人名言,包括文本、作者、标签这些信息。

1.创建项目

在F:PycharmWorkspace目录下创建名为quotesScrapy的项目

2.创建爬虫

创建名为quote的爬虫,限制爬行区域为http://quotes.toscrape.com/

在pycharm中打开创建的项目,Scrapy已经自动为我们创建了很多内容

3.明确目标(items.py)

  • 打开items.py文件
  • Item定义结构化数据字段,用来保存爬取到的数据,类似Python中的dict,并提供了一些额外的保护避免错误
  • 可以通过创建scrapy.Item类,并且定义类型为scrapy.Field的类属性来创建一个Item

我们想要抓取的内容包括名言、作者和标签,所以在items.py中定义detail、author、tags 属性

代码语言:javascript复制
import scrapy

class QuotesscrapyItem(scrapy.Item):  #定义目标字段
    # define the fields for your item here like:
    # name = scrapy.Field()
    detail = scrapy.Field()
    author = scrapy.Field()
    tags = scrapy.Field()

4.制作爬虫(quote.py)

打开quote.py文件,框架已经根据我们创建时的命令编写好了部分代码

代码语言:javascript复制
import scrapy
from quotesScrapy.items import QuotesscrapyItem

class QuoteSpider(scrapy.Spider):
    name = 'quote'                                #爬虫名,创建时定义
    allowed_domains = ['quotes.toscrape.com']     #允许爬取的域,过滤提取的URL
    start_urls = ['http://quotes.toscrape.com/']  #起始的url,列表可修改
    def parse(self, response):                    #response包含downloader下载回来的数据,对response数据做解析的函数
        pass

接下来,我们需要在parse函数中填写解析response的代码

解析方法可以用BeautifulSoup、正则化方法,也可以用scrapy中定义的selectors选择器

selector选择器:

  • Response.css 根据css表达式来"选择"
  • Response.xpath 根据XPath表达式做"选择"

本例中用的是Response.css方法

右击-检查(或审查元素)查看页面具体HTML信息,每条名人名言都在class="quote"的标签下,名言、作者和标签分别在class="text"、class="author"和class="tags"的标签中。

代码语言:javascript复制
def parse(self, response):          #response是downloader下载回来的数据
    quotes=response.css('.quote')   #quotes为列表,包含所有div的标签
    #在每个标签中进一步剥离
     for item in quotes:
         detail=item.css('.text::text').extract_first()  #取列表中第一个内容
         author=item.css('.author::text').extract_first()
         tags=item.css('.tags .tag::text').extract()    #由于tags是列表,在tags下继续查找,得到所有的tag

另外,提取的数据需要送到pipeline中进一步处理,在pipeline中处理的数据为Item类型,所以需要把提取的数据封装成Item对象。完整的quote.py代码如下

代码语言:javascript复制
import scrapy
from quotesScrapy.items import QuotesscrapyItem

class QuoteSpider(scrapy.Spider):
    name = 'quote'                                #爬虫名,创建时定义
    allowed_domains = ['quotes.toscrape.com']     #允许爬取的域,过滤提取的URL
    start_urls = ['http://quotes.toscrape.com/']  #起始的url,列表可修改

    def parse(self, response):          #response是downloader下载回来的数据
        quotes=response.css('.quote')   #quotes为列表,包含所有div的标签
        #进到每个标签中进一步剥离
        for item in quotes:
            detail=item.css('.text::text').extract_first()  #取列表第一个文本内容
            author=item.css('.author::text').extract_first()
            tags=item.css('.tags .tag::text').extract()     #在tags下继续查找,找到所有的tag
            
            #创建类的对象,封装
            new_item=QuotesscrapyItem()
            new_item['detail']=detail
            new_item['author']=author
            new_item['tags']=tags
            yield new_item    #生成器

5.数据处理(pipelines.py)

对爬取的数据做简单保存操作

代码语言:javascript复制
class QuotesscrapyPipeline(object):
    def process_item(self, item, spider):
        with open('quotes.txt','a') as f:
            f.write(item['author'] '--' item['detail'] '--' str(item['tags']) 'n')

6.调整设置(setting.py)

当我们修改pipelines.py中内容时,需要把settings.py中的pipelines相关的代码取消注释

7.运行爬虫

在pycharm的terminal中通过命令运行程序

代码语言:javascript复制
scrapy crawl quote

成功抓取10条名人名言

四、总结

本篇文章主要介绍了爬虫框架Scrapy,编写Scrapy爬虫代码,一共需要4步:

  • 新建项目(scrapy startproject xxx):新建名为xxx的爬虫项目
  • 明确目标(编写items.py):明确想要抓取的目标
  • 制作爬虫(spider/xxspider.py):制作爬虫开始爬取网页
  • 存储内容(pipelines.py):设计管道处理爬取内容

后续连载文章会继续分享python爬虫相关内容,感兴趣记得关注“程序媛驿站”,记得关注每周更新的“python爬虫概述与实践”

作者:balabala

编辑:葡萄媛

0 人点赞