首页 > 技术文章 > 利用scrapy框架爬取动态加载的数据

liaopeng123 2019-03-03 20:34 原文

在爬取有些网站的是后,数据不一定全部是可视化界面的,当我们拖动滚动条时才会加载其他的数据,如果我们也想爬取这部分数据,就需要使用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,
}

 

推荐阅读