scrapy分页抓取网页( 如何Scrapy构建一个简单的网络爬虫?会介绍如何)
优采云 发布时间: 2022-01-12 11:13scrapy分页抓取网页(
如何Scrapy构建一个简单的网络爬虫?会介绍如何)
项目需要灵活的爬虫工具,实现爬虫框架。根据目标网站的结构、地址和需要的内容,进行简单的配置开发即可实现具体的网站爬虫功能。你会发现 Python 下有这个 Scrapy 工具。对于一个普通的网络爬虫功能,Scrapy 完全胜任,并且封装了很多复杂的编程。本文将介绍如何使用 Scrapy 构建一个简单的网络爬虫。
一个基本的爬虫工具,它应该具备以下功能:
让我们看看 Scrapy 是如何做到这一点的。首先准备好Scrapy环境,需要安装Python(本文使用v2.7)和pip,然后使用pip安装lxml和scrapy。个人强烈推荐使用virtualenv安装环境,这样不同项目之间就不会冲突了,详细步骤这里不再赘述。
Mac用户注意,使用pip安装lxml时,会出现类似如下的错误:
错误:#include "xml/xmlversion.h" 未找到
要解决这个问题,你需要先安装 Xcode 的命令行工具。具体方法是在命令行执行如下命令。
1
$ xcode-select --install
环境安装好后,我们用Scrapy实现一个简单的爬虫,抓取本篇博客网站的文章的标题、地址和摘要。
创建项目
1
$ scrapy startproject my_crawler
此命令将在当前目录中创建一个名为“my_crawler”的项目。项目目录结构如下
我的爬虫
|- my_crawler
| |- 蜘蛛
| | |- __init__.py
| |- items.py
| |- pipelines.py
| |- 设置.py
|-scrapy.cfg
设置要爬取的内容的字段
这里是文章的标题、地址和摘要
修改“items.py”文件,在“MyCrawlerItem”类中添加如下代码:
# -*- 编码:utf-8 -*-
导入scrapy
类 MyCrawlerItem(scrapy.Item):
title = scrapy.Field() # 文章Title
url = scrapy.Field()# 文章地址
summary = scrapy.Field() # 文章总结
通过
编写网页解析代码
在“my_crawler/spiders”目录下,创建一个名为“crawl_spider.py”的文件(文件名可以任意)。
代码如下
# -*- 编码:utf-8 -*-
导入scrapy
从 scrapy.linkextractors 导入 LinkExtractor
从 scrapy.spiders 导入 CrawlSpider,规则
从 my_crawler.items 导入 MyCrawlerItem
类 MyCrawlSpider(CrawlSpider):
name = 'my_crawler'# 蜘蛛名,必须唯一,执行爬虫命令时使用
allowed_domains = [''] #限制允许爬取的域名,可设置多个
start_urls = [
"",#*敏*感*词*地址,可设置多个
]
rules = ( #对应具体的URL,设置解析函数,可设置多个
Rule(LinkExtractor(allow=r'/page/[0-9]+'), #指定允许继续爬取的URL格式,支持正则
callback='parse_item', # 用于解析网页的回调函数名
关注=真
),
)
def parse_item(self, response):
# 通过 XPath 获取 Dom 元素
articles = response.xpath('//*[@id="main"]/ul/li')
对于文章中的文章:
item = MyCrawlerItem()
item['title'] = article.xpath('h3[@class="entry-title"]/a/text()').extract()[0]
item['url'] = article.xpath('h3[@class="entry-title"]/a/@href').extract()[0]
item['summary'] = article.xpath('div[2]/p/text()').extract()[0]
产量项目
不熟悉XPath的朋友可以通过Chrome的调试工具获取元素的XPath。
我们测试爬虫的效果
在命令行输入:
1
$ scrapy crawl my_crawler
请注意,这里的“my_crawler”是您在“crawl_spider.py”文件中提供的蜘蛛名称。
几秒钟后,您应该会在控制台上看到要抓取的字段内容。太神奇了! Scrapy 封装了对 HTTP(S) 请求、内容下载、待爬取和爬取的 URL 队列的管理。你的主要工作基本上就是设置URL规则和编写解析方法。
我们将抓取的内容保存为 JSON 文件:
1
$ scrapy crawl my_crawler -o my_crawler.json -t json
在当前目录下可以找到“my_crawler.json”文件,里面存放了我们要爬取的字段信息。 (参数“-t json”可以省略)
将结果保存到数据库
这里我们使用MongoDB,你需要先安装Python MongoDB库“pymongo”。编辑“my_crawler”目录下的“pipelines.py”文件,添加
到“MyCrawlerPipeline”类
以下代码:
# -*- 编码:utf-8 -*-
导入 pymongo
从 scrapy.conf 导入设置
从 scrapy.exceptions 导入 DropItem
类 MyCrawlerPipeline(object):
def __init__(self):
# 建立 MongoDB 连接
connection = pymongo.Connection(
设置['MONGO_SERVER'],
设置['MONGO_PORT']
)
db = 连接[设置['MONGO_DB']]
self.采集 = db[settings['MONGO_采集']]
#处理每一个被爬取的MyCrawlerItem
def process_item(self, item, spider):
有效 = 真
对于项目中的数据:
如果不是数据:# 过滤掉带有空字段的项目
有效 = 假
raise DropItem("Missing {0}!".format(data))
如果有效:
#也可以使用self.采集.insert(dict(item)),使用upsert防止重复
self.采集.update({'url': item['url']}, dict(item), upsert=True)
退货
打开“my_crawler”目录下的“settings.py”文件,在文件末尾添加管道设置:
ITEM_PIPELINES = {
'my_crawler.pipelines.MyCrawlerPipeline': 300, #设置Pipeline,可以有多个,值为执行优先级
}
#MongoDB连接信息
MONGO_SERVER = '本地主机'
MONGO_PORT = 27017
MONGO_DB = 'bjhee'
MONGO_采集 = '文章'
DOWNLOAD_DELAY=2 #如果网络慢,可以加一些延迟,单位是秒
执行爬虫
1
$ scrapy crawl my_crawler
不要忘记启动 MongoDB 并创建“bjhee”数据库。现在可以查询MongoDB中的记录了。
总结一下,要使用Scrapy搭建一个网络爬虫,你需要做的就是:
Scrapy 为您完成所有其他工作。上图是Scrapy的具体工作流程。这个怎么样?开始编写自己的爬虫。