基于Scrapy框架爬取豆瓣图书的设计与实现

2022-08-12 03:30
山西电子技术 2022年4期
关键词:爬虫名称网页

史 媛

(山西机电职业技术学院,山西 长治 046011)

1 什么是Scrapy框架

Scrapy是一个开源协作的框架,基于Twisted,它适用于Python快速、高层次地进行屏幕抓取和抓取web站点信息,从页面中提取结构化数据,常用于数据挖掘、信息处理或存储历史数据等程序中[1]。它提供的框架结构简单明了,架构清晰,模块之间耦合程度低,扩展性很强,任何人可以根据爬取数据的需要对其进行修改,代码编写简单。其还提供了如BaseSpider、sitemap等爬虫基类,功能强大,适用面广泛[2]。

Scrapy框架主要包含了以下几个模块[3],分别是:

● Engine,它是整个框架的核心,主要处理整个系统的数据流,触发事务。

● Item,定义爬取数据的数据结构,爬取到的数据会被赋值成该对象。编写者要根据爬取对象自己编写代码定义其数据结构。

● Scheduler,接受Engine发过来的请求并加入到队列中,在Engine再次请求的时候提供给Engine。

● Downloader,下载网页的内容,并将网页内容返回给Spiders。

● Spiders,定义爬取的逻辑和网页解析规则,主要负责解析响应并生成提取结果和新请求。这部分需要编写者根据网页信息和爬虫的逻辑自己编写。

● Item Pipeline,将从Spiders要爬取的网页中抽取的项目进行处理,清洗、验证和存储爬取到的数据。这部分需要编写者根据爬取结果存储形式和后续用途自己编写。

● Downloader Middlewares,和Downloader之间的连接,处理二者之间的请求和响应。

● Spider Middlewares,Engine和Spiders之间的连接,处理Spiders输入输出的响应和新的请求。

Scrapy中的数据流都由Engine控制,原理如下:

首先,先找到目标网站,然后抓取URL页面的内容。根据response的内容对页面进行分析、抓取,最后将抓取到的数据进行存储。这些模块形成一个循环,直至要抓取的URL为空,网页抓取就结束[4]。

接下来,就来看看Scrapy框架在爬取数据中如何设计各个文件和应用。

2 Scrapy框架爬取数据应用

我们以豆瓣图书前250排名的网页为例。

2.1 创建Scrapy工程

在命令提示符窗口中,使用命令“scrapy startproject工程名称”,在Python文件存储位置处创建Scrapy工程。然后进入到工程中,使用命令“scrapy genspider爬虫名称要爬取网页的地址”,生成爬虫文件。网页地址为:https://book.douban.com/top250?start=0。

2.2 分析网页

使用谷歌浏览器打开上述网址,按下F12键,打开该网页的开发者模式,进入到Elements标签中,获取当前文档的DOM信息,从中定位我们要爬取数据的位置,如图1所示。

图1 豆瓣图书DOM信息

所有图书信息都在

这个总标签下,每本图书都分别在的标签下。从这个标签向下展开,图书名称在标签向下展开第二个“td”标签下的
标签中,从此标签向下展开的“a”标签的文本信息就是图书名称。图书的作者、出版社、出版日期、图书价格信息在
标签向下展开第二个“td”标签向下展开的

标签中。图书的评分信息在

标签向下展开第二个“td”标签向下展开的
标签中,从此标签继续向下展开第二个“span”标签的文本信息就是评分。

下一页的链接如图2所示。在标签

向下展开的“a”标签中,属性“href”的值就是每一页的链接。标签
的位置和
标签的位置是同一级别。从“a”标签的属性值中可以发现规律,每一页的偏移量为25,第一页为0,第二页为25,依次类推,最后一页的偏移量为225。可以采用直接获取链接值转到下一页,也可以设置偏移量的值转到下一页,也可获取标签下“a”标签的“href”属性值转到下一页。

图2 网页链接

2.3 编写Scrapy框架代码

在PyCharm里打开Scrapy工程,就能看到Scrapy框架所对应的相应文件,主要有:items.py、settings.py、pipelines.py和spider路径下定义的爬虫python文件。

● items.py文件

首先要在items.py文件中定义图书的名称、图书的作者、图书的出版社、图书的评分、图书的价格信息数据结构。

在items.py文件中编写如下代码:

import scrapy

class工程名Item(scrapy.Item):

b_name=scrapy.Field()

b_publisher=scrapy.Field()

……

● settings.py文件

在settings.py文件中要设置以下几项内容,完成爬虫项目的配置信息:

BOT_NAME=′……′ #爬虫项目名称

SPIDER_MODULES=[′……′]#Scrapy要搜索的爬虫模块

NEWSPIDER_MODULE=′……′#爬虫文件的模板,由scrapy genspider命令创建

USER_AGENT=′……′#爬虫的head头部信息,不写头部信息容易被网站判断为爬虫,会被网站禁止爬取信息

DEFAULT_REQUEST_HEADERS={

′Accept′:′……′,

′Accept-Language′:′……′,

} #请求头信息,避免403问题

ROBOTSTXT_OBEY=False #是否服从机器人(爬虫)协议,默认为服从,一般会改为False

ITEM_PIPELINES={

′工程名.pipelines.工程名Pipeline′:300,

} #如果要对爬取到的数据永久化保存,需要激活此项。数字越小,优先级越高[5]

● pipelines.py文件

在pipelines.py文件中要处理传输过来的数据,这里我们将爬取到的数据以CSV文件永久化保存,以便后期的数据分析,主要代码如下:

from itemadapter import ItemAdapter

import csv

class DoubanbookscrapyPipeline:

def __init__(self):

path=′ F://d_book250.csv′

self.file=open(path,′ab′,encoding=′utf-8′)

self.writer=csv.writer(self.file)

……

将文件以CSV格式保存起来,后期可以继续使用Python进行分析。也可以写代码将其保存到数据库中,以MySQL数据库常见,在pipelines.py中设置数据库连接、端口等信息,数据保存到数据库中可以使用大数据的其他组件进行分析。

● 爬虫.py文件

爬虫文件中实现在网页中爬取数据。代码思路:首先要给出初始爬取网站的URL,可以使用bs4、正则表达式、xpath、CSS等方法将要爬取的信息抽取出来,交给items.py中对应的数据结构。下一页的URL如何获取,如何转到等这些操作需要在这个文件中编写出来。主要代码如下:

第一部分,爬虫名称和首页的URL要给出来,这些信息在创建工程和文件的时候会自动生成。

name=′doubanbook′

allowed_domains=[′book.douban.com′]

start_urls=[′https://book.douban.com/top250?start=0′]

第二部分,分析response返回的结果,此处使用xpath的方法获取要爬取的信息,将这些信息都赋值给items.py中对应的数据结构,这里item列表中的名称要和数据结构中的名称一致。每一页有25本图书信息,所以使用for循环查找节点信息。

for content in response.xpath("//tr[@class=′item′]"):

item=DoubanbookscrapyItem()

item[′b_title′]=content.xpath("td[2]/div[@class=′pl2′]/a/@title").extract_first()

book_info=content.xpath("td[2]/p[1]/text()").extract_first()

book_info_list=book_info.strip().split(" / ")

item[′b_publish′]=……

yield item

第三部分,下一页继续爬取信息,直到最后一个URL网页爬取完毕。先获取每个页面的URL,形成列表信息,然后for循环遍历该列表,到每一个网页中去爬取信息,直至遍历结束。

next_pages=response.xpath("//div[@class=′paginator′]/a/@href").extract()

for next_page in next_pages:

if next_page:

yield scrapy.Request(next_page,callback=self.parse)

● main.py文件

爬虫代码编写完毕后,可以在命令提示符中使用命令运行,也可在PyCharm中运行。

在PyCharm中,右键单击工程名称,新建一个python文件,名称为main。这个文件主要功能是执行scrapy中的爬虫程序。

from scrapy import cmdline

cmdline.execute([′scrapy′,′crawl′,′爬虫文件名′])

最后运行main.py文件,可以在下方的console中看到爬取的结果。解决CSV文件乱码问题后,可以看到结果文件内容,如图3所示。

图3 CSV文件内容

3 总结

Scrapy框架能够高效率地实现爬虫。作为数据分析的数据来源,用Scrapy框架能够理顺爬虫思路,简化代码。在教学中要求学生须合法地利用该框架去爬取学习所需要的数据,涉及到的分布式爬虫、正则表达式、CSS等技术也可以得到训练。以后的教学中可以更深地去运用Scrapy框架,多实战练习,接近工程实际,提升学生技能水平。

猜你喜欢
爬虫名称网页
利用网络爬虫技术验证房地产灰犀牛之说
基于Python的网络爬虫和反爬虫技术研究
基于HTML5与CSS3的网页设计技术研究
基于CSS的网页导航栏的设计
基于HTML5静态网页设计
大数据背景下校园舆情的爬虫应用研究
基于URL和网页类型的网页信息采集研究
大数据环境下基于python的网络爬虫技术
沪港通一周成交概况
沪港通一周成交概况