php正则函数抓取网页连接(本文会介绍如何Scrapy构建一个简单的网络爬虫(图))

优采云 发布时间: 2021-11-04 14:15

  php正则函数抓取网页连接(本文会介绍如何Scrapy构建一个简单的网络爬虫(图))

  记得n年前项目需要一个灵活的爬虫工具,我组织了一个小团队,用Java实现了一个爬虫框架。可以根据目标网站的结构、地址和内容进行简单的配置开发,即可实现特定网站的爬虫功能。由于要考虑各种特殊情况,开发也需要耗费大量人力。后来发现Python下有这个Scrapy工具,瞬间觉得之前做的都白费了。对于一个普通的网络爬虫功能,Scrapy 完全可以胜任,打包了很多复杂的编程。本文将介绍 Scrapy 如何构建一个简单的网络爬虫。

  一个基本的爬虫工具,应该具备以下功能:

  

  我们来看看Scrapy是如何做这些功能的。首先准备Scrapy环境,需要安装Python(本文使用v2.7)和pip,然后使用pip安装lxml和scrapy。个人强烈推荐使用virtualenv安装环境,所以不同项目之间不会有冲突,详细步骤这里不再赘述。Mac用户请注意,使用pip安装lxml时,会出现类似如下错误:

  > Error: #include "xml/xmlversion.h" not found

  要解决这个问题,需要先安装Xcode的命令行工具。具体方法是在命令行执行如下命令。

  $ xcode-select --install

  环境安装好后,我们用Scrapy实现一个简单的爬虫,抓取本博客网站的文章标题、地址和摘要。

  # -*- coding: utf-8 -*-

import scrapy

class MyCrawlerItem(scrapy.Item):

title = scrapy.Field() # 文章标题

url = scrapy.Field() # 文章地址

summary = scrapy.Field() # 文章摘要

pass

  # -*- coding: utf-8 -*-

import scrapy

from scrapy.linkextractors import LinkExtractor

from scrapy.spiders import CrawlSpider, Rule

from my_crawler.items import MyCrawlerItem

class MyCrawlSpider(CrawlSpider):

name = 'my_crawler' # Spider名,必须唯一,执行爬虫命令时使用

allowed_domains = ['bjhee.com'] # 限定允许爬的域名,可设置多个

start_urls = [

"http://www.bjhee.com", # *敏*感*词*URL,可设置多个

]

rules = ( # 对应特定URL,设置解析函数,可设置多个

Rule(LinkExtractor(allow=r'/page/[0-9]+'), # 指定允许继续爬取的URL格式,支持正则

callback='parse_item', # 用于解析网页的回调函数名

follow=True

),

)

def parse_item(self, response):

# 通过XPath获取Dom元素

articles = response.xpath('//*[@id="main"]/ul/li')

for article in articles:

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]

yield item

  不熟悉XPath的可以通过Chrome的调试工具获取元素的XPath。

  

  # -*- coding: utf-8 -*-

import pymongo

from scrapy.conf import settings

from scrapy.exceptions import DropItem

class MyCrawlerPipeline(object):

def __init__(self):

# 设置MongoDB连接

connection = pymongo.Connection(

settings['MONGO_SERVER'],

settings['MONGO_PORT']

)

db = connection[settings['MONGO_DB']]

self.collection = db[settings['MONGO_COLLECTION']]

# 处理每个被抓取的MyCrawlerItem项

def process_item(self, item, spider):

valid = True

for data in item:

if not data: # 过滤掉存在空字段的项

valid = False

raise DropItem("Missing {0}!".format(data))

if valid:

# 也可以用self.collection.insert(dict(item)),使用upsert可以防止重复项

self.collection.update({'url': item['url']}, dict(item), upsert=True)

return item

  打开my_crawler目录下的settings.py文件,在文件末尾添加管道设置:

  ITEM_PIPELINES = {

'my_crawler.pipelines.MyCrawlerPipeline': 300, # 设置Pipeline,可以多个,值为执行优先级

}

# MongoDB连接信息

MONGO_SERVER = 'localhost'

MONGO_PORT = 27017

MONGO_DB = 'bjhee'

MONGO_COLLECTION = 'articles'

DOWNLOAD_DELAY=2 # 如果网络慢,可以适当加些延迟,单位是秒

  

  总而言之,要使用 Scrapy 构建网络爬虫,您需要做的就是:

  在“items.py”中定义爬取字段在“spiders”目录下创建你的爬虫,编写解析函数和规则“pipelines.py”处理爬取后的结果,“settings.py”是必须的参数

  Scrapy 会为你做其他一切。下图展示了Scrapy的具体工作流程。这个怎么样?开始编写您自己的爬虫。

  

  这个例子中的代码可以在这里下载。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线