在爬取有些網站的是后,數據不一定全部是可視化界面的,當我們拖動滾動條時才會加載其他的數據,如果我們也想爬取這部分數據,就需要使用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, }
