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']
 
    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可以得到更多的其他指令,
 
 
 
 
 
 
    
 
 
 
 
posted @ 2020-12-19 23:17  dos_hello_world  阅读(91)  评论(0)    收藏  举报