scrapy 爬中框架
scrapy 爬中框架
框架简介
scrapy是一个现成可用的爬中框架,用户无需编写整个框架代码,只需要按照框架需求编写框架要求我们自己填写的部分即可。
框架组成部分分为:pipeline scheduler downloder spiders engine。
编程者需要了解的是pipeline spiders这两部分,其余部分由框架自己完成。
通常用户编写好spiders文件后,会将它提交给engine,由engine负责调用schedule,请求download任务,执行download任务的downloader会将response返回给spiders,这就是spiders文件文件夹下的用户爬虫的parse方法的response参数。当spiders将网页爬下后,用户在简单分析文件内容后,需要将有用信息捕获并存储,scrapy中提供存储功能的是pipeline组件,scrapy.spiders组件和pipeline组件之间使用items完成通讯。由于爬取的目标不一样时,item的属性也不一样,所以该文件需要用户自定义,定义完成后在scrapy和pipeline中可以像字典一样使用。
通常用户需要编写的文件,spiders文件夹下的用户自定义spider文件,items.py,pipelines.py。一般就这三个文件,但有时候还需要编写setting.py。该文件定义了scrapy反会的items.py由那些pipelines处理,若指定了多个,则表明可能需要将爬下来的内容,同时存到多个地方,如硬盘和数据库。
内容选择
在开始爬取内容之前,用户必须了解如何从html中选择自己感兴趣的内容,最基本的方法是当获取到页面后,使用python的re模块分析匹配,scrapy支持xpath和css方式匹配内容。
如:
response.css('title::text')[0].extract()
title表示匹配title元素,text表示获取title的内容
推荐使用xpath,因为xpath是css的基础,功能比css更为强大
不熟悉xpath的情况下,可以使用谷歌浏览器自带的xpath工具,打开谷歌浏览器,选择右边的自定义及控制,继续选择更多工具,开发者工具,在弹出的窗口中选择elements,并在下面出现的窗口中选择自己想要获取的目标元素,选中后,右击选择copy xpath即可使用。
开始项目:
由于scrapy是一个框架,因此并不需要想创建py工程一样开始,必须使用scrapy提供的方法开始有关的编程。
创建项目:
scrapy startproject picture
创建项目文件夹,基本项目文件
cd picture
scrapy genspider pic mmonly.cc
创建爬虫文件,制定爬虫名pic,爬中允许爬取的域mmonly.cc
=========================================================================
先爬取页面标题:
import scrapy
class PicSpider(scrapy.Spider):
name = 'pic' #爬虫名 -固定写法
allowed_domains = ['www.mmonly.cc'] #爬的域 -固定写法
start_urls = ['http://www.mmonly.cc/mmtp/xgmn/100879.html'] #爬的目标网页 -固定写法
def parse(self, response): #用户自定义函数
print '-'*20
selector = response.xpath('/html/body/div[2]/div[2]/div[2]/h1/text()').extract()
print '='*20
print selector #注意返回值是一个list
print selector[0]
======================================================================================
继续爬取一张图片
import scrapy
import urllib
import os
class PicSpider(scrapy.Spider):
name = 'pic'
allowed_domains = ['www.mmonly.cc']
start_urls = ['http://www.mmonly.cc/mmtp/xgmn/100879.html']
def parse(self, response):
print '-'*20
selector = response.xpath('//*[@id="big-pic"]/p/a/img/@src').extract()
print '='*20
print selector[0] #获取美女图片的下载地址,即img元素的src属性
if selector[0]:
absoluteSrc = selector[0]
file_name = "lsl.jpg"
file_path = os.path.join("F:\python\pic", file_name) # 拼接这个图片的路径,我是放在F盘的\python\pic 文件夹下
print 'download'
#使用urllib库直接在这里将图片下载,这种方法并非正道,调试将就而已
urllib.urlretrieve(absoluteSrc, file_path) # 接收文件路径和需要保存的路径,会自动去文件路径下载并保存到我们指定的本地路径
=========================================================================
pipelines下载图片:
以上方法实现了图片的获取,但实际中为了将数据在pipelines中进行下载需要做其它处理
在settings.py中添加以下参数:
添加管道,使得自定义的爬虫文件能将item参数传递到pipelines中,左边为pipeline文件路径,右边为多个管道存在时的优先权,越小越优先
ITEM_PIPELINES = {
'picture.pipelines.PicturePipeline': 300,
}
图片存储路径:
IMAGES_STORE = "F:\python\pic"
这个是针对采用scrapy自带的图片模块才有效的,如果自己写就用不上了
定义items
import scrapy
class PictureItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
url = scrapy.Field()
name = scrapy.Field()
total = scrapy.Field()
定义爬虫
# -*- coding: utf-8 -*-
import scrapy
from ..items import PictureItem
import re
import urllib
import os
class PicSpider(scrapy.Spider):
name = 'pic'
allowed_domains = ['www.mmonly.cc']
start_urls = ['http://www.mmonly.cc/tag/cs/']
def parse(self, response):
name = response.xpath('/html/body/div[2]/div[2]/div[2]/h1/text()').extract()[0]
numstr = response.xpath('/html/body/div[2]/div[2]/div[2]/div[6]/ul/li[1]/a/text()').extract()[0]
num = re.search('\d+',numstr).group()
print url
print num
print name
item = PictureItem()
item['url'] = url
item['total'] = num
item['name'] = name
yield item
定义管道:
class PicturePipeline(object):
def process_item(self, item, spider):
print item
return item
由于时间缘故,已经来不及写对应的处理。暂时搁置,但是这里打印可得到item字典与picspider处的一样
<未写完主要是因为网页那部分连续处理没做好>
另外补充一下爬虫执行的命令:
scrapy crawl pic
在执行窗口使用scrapy --help可以得到更多的其他指令,

浙公网安备 33010602011771号