zoukankan      html  css  js  c++  java
  • Scrapy爬虫框架的学习

     第一步安装

    首先得安装它,我使用的pip安装的

    因为我电脑上面安装了两个python,一个是python2.x,一个是python3.x,所以为了区分,所以,在cmd中,我就使用命令:python2 -m pip install Scrapy  (注意我这里使用python2的原因是我给2个python重命名了一下)

     安装之后,输入scrapy,出现如下图这样子的信息,表示成功安装了

     如果有错误,可以参考一下:http://www.cnblogs.com/angelgril/p/7511741.html  ,有可能会有用

    第二步新建项目

    通过命令scrapy startproject xxx  来创建scrapy项目 (注意:你在哪个文件夹下面使用这个命令,项目就创建在哪个文件夹下面,你可以cd到某个你特定的文件夹下面,在使用该命令创建项目)

    创建完后,用pycharm编辑器打开项目

    项目结构如下图:

    下面来简单介绍一下各个文件的作用:
    scrapy.cfg :项目的配置文件
    tencentProject/ :项目的Python模块,将会从这里引用代码
    tencentProject/items.py :项目的items文件
    tencentProject/pipelines.py :项目的pipelines文件
    tencentProject/settings.py :项目的设置文件
    tencentProject/spiders/ :存储爬虫的目录

    scrapy 爬虫网站 一共需要4步:
    新建项目 (Project):新建一个新的爬虫项目
    明确目标 (Items):明确你想要抓取的目标
    制作爬虫 (Spider):制作爬虫开始爬取网页
    存储内容 (Pipeline):设计管道存储爬取内容

    第三步明确目标

    修改 tencentProject目录下的 items.py 文件,添加相应的属性,(注意:scrapy.Field(),是固定的,只要记住就行了)

    刚开始看起来可能会有些看不懂,但是定义这些item能让你用其他组件的时候知道你的items到底是什么。可以把Item简单的理解成封装好的类对象

     

    第四步制作爬虫

    1、爬取

    要建立一个Spider, 你必须用scrapy.spider.BaseSpider创建一个子类 ,并确定 三 个强制的属性:

    name :爬虫的识别名称,必须是唯一的,在不同的爬虫中你必须定义不同的名字。
    start_urls :爬取的URL列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会
    从这些urls开始。其他子URL将会从这些起始URL中继承性生成。
    parse() :解析的方法,调用的时候传入从每一个URL传回的Response对象作为唯一参
    数,负责解析并匹配抓取的数据(解析为item),跟踪更多的URL

    可选设置的参数allow_domains 是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页。

    在Scrapy里,使用一种叫做  XPath selectors 的机制,它基于  XPath 表达式,

    下面我们来定义一只爬虫,命名为 tencent.py ,保存在 tencentProjectspiders 目录下。

    tencent.py代码如下:

    # -*- coding: utf-8 -*-
    import scrapy
    from tencentProject.items import TencentprojectItem
    
    class TencentSpider(scrapy.Spider):
        # 爬虫名
        name = 'tencent'
        # 爬虫爬取数据的域范围
        allowed_domains = ['tencent.com']
        # 1. 需要拼接的url
        baseURL = "http://hr.tencent.com/position.php?&start="
        # 1. 需要拼接的url地址的偏移量
        offset = 0
        # 爬虫启动时,读取的url地址列表
        start_urls = [baseURL + str(offset)]
    
        # 用来处理response
        def parse(self, response):
            # 提取每个response的数据
            node_list = response.xpath("//tr[@class='even'] | //tr[@class='odd']")
    
            for node in node_list:
                # 构建item对象,用来保存数据
                item = TencentprojectItem()
                # 提取每个职位的信息,并且将提取出的Unicode字符串编码为UTF-8编码
                item['positionName'] = node.xpath("./td[1]/a/text()").extract()[0].encode("utf-8")
    
                item['positionLink'] = node.xpath("./td[1]/a/@href").extract()[0].encode("utf-8")
    
                if len(node.xpath("./td[2]/text()")):
                    item['positionType'] = node.xpath("./td[2]/text()").extract()[0].encode("utf-8")
                else:
                    item['positionType'] = "NULL"
    
                item['peopleNumber'] = node.xpath("./td[3]/text()").extract()[0].encode("utf-8")
    
                item['workLocation'] = node.xpath("./td[4]/text()").extract()[0].encode("utf-8")
    
                item['publishTime'] = node.xpath("./td[5]/text()").extract()[0].encode("utf-8")
    
                # yield 的重要性,是返回数据后还能回来接着执行代码
                yield item
    
            # 第一种写法:拼接url,适用场景:页面没有可以点击的请求连接,必须通过拼接url才能获取响应
            # if self.offset < 2190:
            #     self.offset += 10
            #     url = self.baseURL + str(self.offset)
            #     yield scrapy.Request(url, callback = self.parse)
    
    
            # 第二种写法:直接从response获取需要爬取的连接,并发送请求处理,直到链接全部提取完
            if len(response.xpath("//a[@class='noactive' and @id='next']")) == 0:
    
                url = response.xpath("//a[@id='next']/@href").extract()[0]
                yield scrapy.Request("http://hr.tencent.com/" + url, callback = self.parse)
        #def parse_next(self, response):
        #    pass
    tencent.py

    注意:里面的关键字yield 的作用是:返回数据后,还能继续去执行未完成的操作,它不像return,但是,它又有return的返回数据的功能

    2、存储

    在管道文件pipelines.py 去添加一下代码:

    # -*- coding: utf-8 -*-
    
    # Define your item pipelines here
    #
    # Don't forget to add your pipeline to the ITEM_PIPELINES setting
    # See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
    import json
    
    
    
    
    class TencentprojectPipeline(object):
    
        def __init__(self):
            self.f=open("tencent.json","w")
        def process_item(self, item, spider):
            #设置完后,一定要去去掉settings.py文件中的注释,才能启用管道
            '''
            ITEM_PIPELINES = {
                'tencentProject.pipelines.TencentprojectPipeline': 300,}
            '''
            content=json.dumps(dict(item),ensure_ascii=False)+",
    "   #json.dumps()转换成json类型的字符串,ensure_ascii=False 表示遵循unicode编码来转换
            self.f.write(content)
            return item
    
        def close_spider(self,spider):
            self.f.close()
    

      

  • 相关阅读:
    tushare包使用案例
    Matplotlib模块:绘图和可视化
    pandas使用
    django 表操作
    元数据Meta
    django关系类型字段
    django项目模型字段
    django项目mysite 2
    django安装使用xadmin
    GCC版本中没有GLIBCXX_3.4.15错误
  • 原文地址:https://www.cnblogs.com/angelgril/p/7516377.html
Copyright © 2011-2022 走看看