zoukankan      html  css  js  c++  java
  • scrapy基本的流程 糗事百科

    https://www.cnblogs.com/c-x-a/p/9889623.html

    创建scrapy工程

    1、scrapy startproject xxx xxx就是你的项目名,这里我们给我们的项目起名qiushibaike。

    然后我们会发现了多了一个文件名为qiushibaike的文件夹

    scrapy startproject xxx


    2、然后我们通过命令创建一个事例工程

    cd qiushibaike

    3、然后用下面scrapy的第二个命令genspider
    使用方法 scrapy genspider spider_name domain
    spider_name就是爬虫的名字,每一个爬虫有一个名字这个名字是唯一的,后面运行的时候也是通过这个名字来运行的,下面的qsbk就是我们的爬虫名字,domain指定爬虫的域也就是爬虫的范围。查找网页我们发现域名为qiushibaike.com

    scrapy genspider qsbk qiushibaike.com

    开始编写spider文件

    用pycharm把我们的爬虫工程加载进来。

    修改settings.py文件

    无视robots协议,将ROBOTSTXT_OBEY = True 改为ROBOTSTXT_OBEY = False

    修改spider.py

    看看我们访问的网页源码对不对。
    把qsbk.py 进行修改

    # -*- coding: utf-8 -*-
    import scrapy
    
    
    class QsbkSpider(scrapy.Spider):
        name = 'qsbk'
        allowed_domains = ['qiushibaike.com']
        start_urls = ['http://qiushibaike.com/']#种子url,列表类型表示支持多个
    
        def parse(self, response):
            print(response.text)#输出源码
    View Code

    创建入口文件运行

    在项目的根目录下创建一个run.py 来运行我们的工程
    run.py的内容如下

    # -*- coding: utf-8 -*-
    # @Time : 2018/10/31 11:54 PM
    # @Author : cxa
    # @File : run.py.py
    # @Software: PyCharm
    from scrapy.cmdline import execute
    execute(['scrapy','crawl','qsbk'])

    运行以后找到了error关键字,可以得知爬虫出错了

    修改中间件加入headers信息

    首先修改middlewares.py

    class UserAgentMiddleware(object):
    
        def __init__(self, user_agent_list):
            self.user_agent = user_agent_list
    
        @classmethod
        def from_crawler(cls, crawler, *args, **kwargs):
            # 获取配置文件中的MY_USER_AGENT字段
            middleware = cls(crawler.settings.get('MY_USER_AGENT'))
            return middleware
    
        def process_request(self, request, spider):
            # 随机选择一个user-agent
            request.headers['user-agent'] = random.choice(self.user_agent)
    View Code

    然后在settings启用我们的中间件和设定MY_USER_AGENT的值:

    MY_USER_AGENT = ["Mozilla/5.0+(Windows+NT+6.2;+WOW64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/45.0.2454.101+Safari/537.36",
        "Mozilla/5.0+(Windows+NT+5.1)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/28.0.1500.95+Safari/537.36+SE+2.X+MetaSr+1.0",
        "Mozilla/5.0+(Windows+NT+6.1;+WOW64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/50.0.2657.3+Safari/537.36"]
    
    DOWNLOADER_MIDDLEWARES = {
       'qiushibaike.middlewares.UserAgentMiddleware': 543,
    }
    View Code

    再次运行,run.py文件,成功获取了源码

    解析网页中所需要的内容

    因为这10页的结构是类似的我们就拿第一页为例:
    在这里我们使用的解析方法为xpath,通过xpath可以解析出我们需要的内容,
    打开谷歌浏览器的开发者工具,首先通过Elements模块获取当前页所有内容的大概区域我们可以写这样的一个xpath。

    "//div[@id='content-left']"

    然后我们发现一页25个内容,然后再去在每个内容里进行查找当前的标题和内容。
    在qsbk.py文件的parse方法里加入这段内容

    content_left_node=response.xpath("//div[@id='content-left']") #确定发布区的节点区域
            div_node_list=content_left_node.xpath("./div")
            for div_node in  div_node_list:
                title_node=div_node.xpath(".//div[@class='author clearfix']/a[contains(@onclick,'web-list-author-text')]/h2/text()")
                content_node=div_node.xpath(".//div[@class='content']/span[1]")
                content=content_node.xpath('string(.)')
                print("发布者",title_node.extract_first().strip())
                print("发布内容",content.extract_first().strip())
    View Code

    修改scrapy的日志显示等级方便查看

    修改settings.py文件通过修改log的等级,只显示指定类型的log,打开settings.py我们加上下面的一句来设定log的等级为error
    也就是只有错误的时候才显示scrapy的log信息。

    LOG_LEVEL = "ERROR"

    保存结果到mongodb

    mongodb是一个key-value型的数据库,使用起来简单,数据结构是键值对类型,在存储过程中如果表不存在就会创建一个新的表。
    下面我们开始来存储我们的数据。

    构造数据

    因为我们需要接收一个键值对类型的数据,一般用dict,所以我们将代码改成如下形式。qsbk.py文件新增内容:

     item = {}
                item['name'] = name
                item['info'] = info
                yield item

    上面我们构造出了我们需要存储的数据,然后通过yield传递到存储部分,
    下一步我们就要开始创建mongo连接的部分了

    创建mongo连接文件

    把pipelines.py 文件改为

    import pymongo
    from scrapy.conf import settings
    
    class MongoPipeline(object):
        def __init__(self):
            # 链接数据库
            self.client = pymongo.MongoClient(host=settings['MONGO_HOST'], port=settings['MONGO_PORT'])
            if settings.get('MINGO_USER'):
                   self.client.admin.authenticate(settings['MINGO_USER'], settings['MONGO_PSW'])
            self.db = self.client[settings['MONGO_DB']]  # 获得数据库
            self.coll = self.db[settings['MONGO_COLL']]  # 获得collection
    
        def process_item(self, item, spider):
            postItem = dict(item)  # 把item转化成字典形式
            self.coll.insert(postItem)  # 向数据库插入一条记录
            return item 
    View Code

    然后修改settings.py,首先添加mongo的几个连接参数

    MONGO_HOST = "127.0.0.1"  # 主机IP
    MONGO_PORT = 27017  # 端口号
    MONGO_DB = "spider_data"  # 库名
    MONGO_COLL = "qsbk"  # collection名
    View Code

    然后打开pipe通道

    ITEM_PIPELINES = {
       'qiushibaike.pipelines.MongoPipeline': 300,
    }

    运行查看数据

    代码可以在git上查找:

    https://github.com/muzico425/qsbk.git

  • 相关阅读:
    Mysql5.5安装
    JVM内存管理
    jquery, js轮播图插件Swiper3
    Redis基本结构
    ArcGIS10.1发布WFS-T服务
    ArcGIS10.1如何将数据库注册到ARCSERVER服务器
    转:Oracle密码过期,取消密码180天限制
    oracle数据库导入导出命令
    转载:oracle11G 已开启监听,但远程连接依旧无监听解决过程
    Xcode group
  • 原文地址:https://www.cnblogs.com/xingnie/p/10335931.html
Copyright © 2011-2022 走看看