zoukankan      html  css  js  c++  java
  • 利用scrapy框架爬取动态加载的数据

    在爬取有些网站的是后,数据不一定全部是可视化界面的,当我们拖动滚动条时才会加载其他的数据,如果我们也想爬取这部分数据,就需要使用selenium模块,在scrapy里可以结合该模块修改返回对象

    一、编写爬虫文件代码 

     1 import scrapy
     2 from selenium import webdriver
     3 from wangyi.items import WangyiItem
     4 
     5 
     6 class TestSpider(scrapy.Spider):
     7     name = 'test'
     8     # allowed_domains = ['www.xxx.com']
     9     start_urls = ['http://war.163.com/']
    10 
    11     def __init__(self):
    12         self.bro = webdriver.Chrome(executable_path=r'F:爬虫加数据练习第三天chromedriver.exe')
    13 
    14     def parse(self, response):
    15 
    16         div_list = response.xpath('//div[@class="data_row news_article clearfix "]')
    17         for div in div_list:
    18             item = WangyiItem()
    19             title = div.xpath('./div/div/h3/a/text()').extract_first()
    20             time = div.xpath('./div/div[2]/span/text()').extract_first()
    21             print(title)
    22             item['title'] = title
    23             item['time'] = time
    24             yield item
    25 
    26     def closed(self, spider):
    27         print('关闭浏览器对象!')
    28         self.bro.quit()

    注意,当创建完浏览器对象时,按照以前的写法,我们会直接的解析def parse 方法的返回值response来获取对象,很遗憾这里不是,因为我们要爬取的网页的数据是动态加载的,所有我们需要在middlewares.py文件改变他的返回对象response,所以说上面的response是我们改变之后的返回对象

    二、修改response对象

      在中间件里有两个类,SpiderMiddleware 和 DownloaderMiddleware,这里修改的是 DownloaderMiddleware 下的 def process_response,具体原理可以看看 scrapy 的五大核心组件

      修改代码
      

     1 from scrapy.http import HtmlResponse    
     2 def process_response(self, request, response, spider):
     3         # Called with the response returned from the downloader.
     4 
     5         # Must either;
     6         # - return a Response object
     7         # - return a Request object
     8         # - or raise IgnoreRequest
     9         bro = spider.bro
    10         bro.get(url=request.url)
    11         sleep(3)
    12         # 获取爬取的数据
    13         page_text = bro.page_source
    14         sleep(3)
    15 
    16         return HtmlResponse(url=spider.bro.current_url, body=page_text, encoding='utf8', request=request)

    spider 是爬虫文件的对象,spider.bro是初始化创建的浏览器对象,request.url 是起始地址 和下面的spider.bro.current_url 是同一个地址,最终返回修改后的response

    返回值后就可以对数据进行解析,获取对应的数据,

    三、将获取的数据做持久化存储,

      在前几篇介绍过,这里不重复写

    四、修改配置文件

    DOWNLOADER_MIDDLEWARES = {
       'wangyi.middlewares.WangyiDownloaderMiddleware': 543,
    }
  • 相关阅读:
    微人事项目-mybatis-持久层
    通过外键连接多个表
    springioc
    Redis 消息中间件 ServiceStack.Redis 轻量级
    深度数据对接 链接服务器 数据传输
    sqlserver 抓取所有执行语句 SQL语句分析 死锁 抓取
    sqlserver 索引优化 CPU占用过高 执行分析 服务器检查
    sql server 远程备份 bak 删除
    冒泡排序
    多线程 异步 beginInvoke EndInvoke 使用
  • 原文地址:https://www.cnblogs.com/liaopeng123/p/10467408.html
Copyright © 2011-2022 走看看