您的位置:首页 > 其它

Scrapy 爬虫框架爬取网页数据

2015-10-29 22:44 429 查看

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, Field

class CarItem(Item):
car_id = Field()  # 汽车id
image = Field()  # 图片地址
price = Field()  # 价格
down_price = Field()  # 降价幅度
title = Field()  # 汽车名称
labels = Field()  # 标签


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

from scrapy.selector import Selector
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from car_scrapy.items import CarItem
import re

class 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 MongoClient
from settings import DB_NAME

class 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: