scrapy分页抓取网页( 如何Scrapy构建一个简单的网络爬虫?会介绍如何)

优采云 发布时间: 2022-01-12 11:13

  scrapy分页抓取网页(

如何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的具体工作流程。这个怎么样?开始编写自己的爬虫。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线