前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >项目实战 | Python爬虫概述与实践(三)

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

作者头像
用户3946442
发布2022-04-11 18:51:56
5330
发布2022-04-11 18:51:56
举报
文章被收录于专栏:程序媛驿站

前言

《项目实战 | 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

编辑:葡萄媛

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序媛驿站 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档