Scrapy 爬虫框架爬取网页数据

来源:转载

Scrapy 爬虫框架爬取网页数据

由于知识储备有限,见解或编码有错误,希望大家能指明~共同进步~~

在没有正式接触python之前,也用python 写过小的爬虫demo,记得当时用的urllib发送网络请求获取源码后用beautifulsoup解析的html,(当时还以为很厉害的样子,线程之类的都没用,慢的基本让人受不了~~),前几天看到scrapy框架后感觉之前都是弱爆了(屠龙宝刀跟霸业面甲就是没法比啊),所以准备写一文章,熟悉一下框架的使用和一些新技术的应用吧.

首先介绍下本系列文章会用的技术吧
- Scrapy爬虫框架
- XPath(解析html)
- MongoDB
- Linux基本操作
- Python基础知识~


首先安装下虚拟沙盒 virtualenv

Mac 和 Ubutun 都可以直接pip安装
pip install virtualenv

然后创建虚拟环境安装scrapy
➜ ~ virtualenv car-ENV && cd car-ENV
Running virtualenv with interpreter /usr/bin/python2
New python executable in car-ENV/bin/python2
Not overwriting existing python script car-ENV/bin/python (you must use car-ENV/bin/python2)
Installing setuptools, pip…done.
➜ car-ENV source ./bin/activate
(car-ENV)➜ car-ENV pip install scrapy
Downloading/unpacking scrapy

….

等一会就安装完成了
然后安装MongoDB
ubutun :apt-get install mongodb
mac : brew install mongodb (brew 需自行安装)

接下来了解下 Scrapy 框架
中文文档:http://scrapy-chs.readthedocs.org/zh_CN/latest/intro/tutorial.html
官方网址:http://scrapy.org/

An open source and collaborative framework for extracting the data you need from websites. In a fast, simple, yet extensible way.
正如官网上说的一样,快速,简单,扩展性好.用过之后你就会知道他的强大~

下面开始我们的爬虫之旅
新建项目还是非常简单的

可以看到scrapy项目主要是两个目录六个文件

  • Item :定义实体数据结构
  • Spiders:定义爬取规则,实现爬取网页具体编码
  • Item Pipeline:存取爬出的数据,实现存取具体实现方法
  • Settings:配置文件

首先看一个爬出的网页太平洋汽车网
http://newcar.xcar.com.cn/car/
http://newcar.xcar.com.cn/m25720/
爬取汽车的详细信息:

我们需要爬出的信息是汽车的名称,价格,降价情况以及一些特点等信息.在这里首先要查看网页源码并且了解爬取的规则,scrapy框架的命令行工具就是比较方便的了.

准备工作一:使用XPath解析html获取所需信息
实例如下~

首先看下汽车的标题源码

命令行中启动


通过xpath可以获取到汽车的标题(由于编码方式不一致所以显示不一致而已)
可以通过相同方式可以获取到其他的所需信息

准备工作二:MongoDB使用
前边已经介绍过mongo的安装了(时下最流行的NoSQL,详细介绍可以查看官方文档)
python 有与mongodb连接的模块—-PyMongo(pip 安装即可)
看一下简单使用(官方文档 http://api.mongodb.org/python/current/)
插入coll.insert({‘name’:’xiaoxiao’})
更新的话可以查询后用save()保存
查询find_one 常用方法还是比较简单的

准备工作完成了,下面就开始爬虫项目的编写了:

1 需要定义爬取的数据结构

from scrapy.item import Item, Fieldclass CarItem(Item): car_id = Field() # 汽车id image = Field() # 图片地址 price = Field() # 价格 down_price = Field() # 降价幅度 title = Field() # 汽车名称 labels = Field() # 标签

2 核心代码就是爬虫的编码了

from scrapy.selector import Selectorfrom scrapy.contrib.spiders import CrawlSpider, Rulefrom scrapy.contrib.linkextractors.sgml import SgmlLinkExtractorfrom car_scrapy.items import CarItemimport reclass CarSpider(CrawlSpider): name = 'car' start_urls = [ 'http://newcar.xcar.com.cn/car/' ] rules = [ Rule(SgmlLinkExtractor(allow="/car/(0-){11}/d*/"), follow=True), Rule(SgmlLinkExtractor(allow="com/.cn/m/d*/$"), callback='parse_info', follow=True), ] def parse_info(self, response): item = CarItem() sel = Selector(response) pattern = '/d+' item['car_id'] = int(re.search(pattern, str(response.url)).group()) li = sel.xpath('//div[@id="basic_info"]/ul/li') item['title'] = li.xpath('div[@class="focus_title"]/h1/span/text()').extract()[0] images = li.xpath('div[@class="focus_photo2"]/a/img/@src').extract() if images: item['image'] = images[0] item['price'] = float(li.xpath('div[@class="focus_info"]/div[1]/a/b/text()').extract()[0]) down_price = li.xpath('div[@class="focus_info"]/div[1]/i/a/b/text()').extract() if down_price: item['down_price'] = float(down_price[0]) else: item['down_price'] = 0 labels_dds = li.xpath('div[@class="focus_info"]/div[@class="deploy_box"]/div/dl/dd') labels = [] for lable in labels_dds: la_name = lable.xpath('text()').extract() if la_name: labels.append(la_name[0]) item['labels'] = labels yield item

name 定义爬虫名称
start_urls 定义爬虫爬取的初始网页
rules 定义的是爬取的具体页面,根据正则匹配需要爬取或操作页面(follow表示是否跟进,callback是回调函数)
parse_info 就是具体爬出数据的回调,其中的方法就是根据XPath解析html,获取所需数据,简单举例前面已经提及.

3 接下来也是中心环节,数据的保存
就是简单的数据保存而已,前面也已经举例

from pymongo import MongoClientfrom settings import DB_NAMEclass CarPipeline(object): def __init__(self): """初始化链接""" self.db = MongoClient()[DB_NAME] def process_item(self, item, spider): json_str = {} for key in item.keys(): json_str[key] = item[key] if self.db.car.find({'car_id': item['car_id']}).count() == 0: self.db.car.insert(json_str) else: self.db.car.update({'car_id': item['car_id']}, json_str) return item

部分网站是不允许机器爬出数据的,网站会根据ip,请求头,请求频率等进行限制.
此时可以配置请求代理已经请求的频率等等.
而且对于网页中的链接是有重复的,而且我们需要的链接深度也有限制,这一切都可以根据配置文件进行配置

4 接下来可以配置配置文件

BOT_NAME = 'car_scrapy'DB_NAME = 'car'SPIDER_MODULES = ['car_scrapy.spiders']NEWSPIDER_MODULE = 'car_scrapy.spiders'ITEM_PIPELINES = { 'car_scrapy.pipelines.CarPipeline': 300,}DOWNLOADER_MIDDLEWARES = { # 'car_scrapy.misc.middleware.CustomHttpProxyMiddleware': 400, 'car_scrapy.misc.middleware.CustomUserAgentMiddleware': 401,}

5 执行爬出命令进行爬取

数据两比较大,需要等一段时间

爬取完成后可以查看共爬取6460条数据~

至此,简单的爬虫项目完成~~~
git 源码地址:https://github.com/wangpanjun/scrapy-example.git



分享给朋友:
您可能感兴趣的文章:
随机阅读: