利用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,
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM