标签下“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框架,多实战练习,接近工程实际,提升学生技能水平。