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
相关文章推荐
- ORA-12514: TNS:监听程序当前无法识别连接描述符中请求的服务
- Median Smoothing(构造性算法)
- ORA-12514: TNS:监听程序当前无法识别连接描述符中请求的服务
- ORA-12514: TNS:监听程序当前无法识别连接描述符中请求的服务
- 正则表达式
- ios中block的循环引用
- LA3708 Graveyard 墓地雕塑-水题
- Tab or 空格?这是一个问题,其实也不是问题
- js值得注意的一个细节
- 【C】strcpy()需谨慎使用
- 从机器学习谈起
- Java并发编程(一)_线程安全性
- 腾讯后台开发面试题2
- 项目冲刺--第二天
- 服务端接口测试
- MySQL 5.7.17源码编译安装说明
- UICollectionViewController简单操作(2)
- CODEVS3027线段覆盖2
- 正则表达式 概述
- 买了个梯子,开始关注官方文档