selenium在scrapy中的使用代碼
在通過scrapy框架進行某些網(wǎng)站數(shù)據(jù)爬取的時候,往往會碰到頁面動態(tài)數(shù)據(jù)加載的情況發(fā)生,如果直接使用scrapy對其url發(fā)請求,是絕對獲取不到那部分動態(tài)加載出來的數(shù)據(jù)值。但是通過觀察我們會發(fā)現(xiàn),通過瀏覽器進行url請求發(fā)送則會加載出對應(yīng)的動態(tài)加載出的數(shù)據(jù)。那么如果我們想要在scrapy也獲取動態(tài)加載出的數(shù)據(jù),則必須使用selenium創(chuàng)建瀏覽器對象,然后通過該瀏覽器對象進行請求發(fā)送,獲取動態(tài)加載的數(shù)據(jù)值。本文重點給大家介紹selenium在scrapy中的使用,具體內(nèi)容如下所示:
使用目的
爬取網(wǎng)易新聞國內(nèi)、國際、軍事、航空4個版塊的新聞。在測試中發(fā)現(xiàn)各版塊的新聞是動態(tài)加載的,如果直接爬取無法獲取,使用selenium幫助獲取此部分數(shù)據(jù)。
代碼
spider
import scrapy from selenium import webdriver from wangyiPro.items import WangyiproItem class WangyiSpider(scrapy.Spider): name = 'wangyi' # allowed_domains = ['www.xxx.com'] start_urls = ['https://news.163.com/'] model_url = [] hro = webdriver.Chrome() def parse(self, response): # 從所有版塊中篩選出所需要下載的4個版塊 li_list = response.xpath('/html/body/div[1]/div[1]/div[2]/div[2]/div[2]/div[2]/div/ul/li') indexs = [3,4,6,7] for index in indexs: model_li = li_list[index] model_list = model_li.xpath('./a/@href').extract_first() self.model_url.append(model_list) for url in self.model_url: yield scrapy.Request(url=url,callback=self.parse_model) # 數(shù)據(jù)解析:新聞標題+新聞詳情頁的url(動態(tài)加載數(shù)據(jù)) def parse_model(self,response): # 直接對response解析無法獲取該數(shù)據(jù)(動態(tài)加載數(shù)據(jù)) # 無法拿到動態(tài)加載數(shù)據(jù)返回的響應(yīng)數(shù)據(jù)就不足 # 使用中間件修改不滿足需求的響應(yīng)對象中的響應(yīng)數(shù)據(jù),將其改為包含動態(tài)加載數(shù)據(jù)的響應(yīng)數(shù)據(jù) div_list = response.xpath('/html/body/div/div[3]/div[4]/div[1]/div[1]/div/ul/li/div/div') for div in div_list: title = div.xpath('./div/div[1]/h3/a/text()').extract_first() new_url_detail = div.xpath('./div/div[1]/h3/a/@href').extract_first() if new_url_detail: item = WangyiproItem() item['title'] = title yield scrapy.Request(url=new_url_detail,callback=self.parse_detail,meta={'item':item}) def parse_detail(self,response): # 返回的列表,需要將其轉(zhuǎn)換為字符串 content = response.xpath('/html/body/div[3]/div[1]/div[3]/div[2]/p/text()').extract() content = ''.join(content) item = response.meta['item'] item['content'] = content yield item # 重寫爬蟲類父類方法,該方法在爬蟲程序執(zhí)行結(jié)束后立即執(zhí)行 def closed(self,spider): # 打開selenium需要關(guān)閉 self.hro.quit()
middlewares
from time import sleep from scrapy.http import HtmlResponse#scrapy封裝好的響應(yīng)類 class WangyiproDownloaderMiddleware: def process_request(self, request, spider): return None # 攔截所有的響應(yīng)對象 # 整個工程發(fā)起的請求:1+4+n 對應(yīng)相同的響應(yīng) def process_response(self, request, response, spider): # 從所有攔截對象中找到4個需修改的響應(yīng)對象 if request.url in spider.model_url: hro = spider.hro hro.get(request.url) sleep(2) # 網(wǎng)頁下拉到底,獲取更多動態(tài)加載數(shù)據(jù) hro.execute_script('window.scrollTo(0,document.body.scrollHeight)') sleep(1) page_text = hro.page_source # response.text = page_text # 返回一個新的響應(yīng)對象 return HtmlResponse(url=request.url,body=page_text,encoding='utf-8',request=request) # 如果不是需要修改的響應(yīng)數(shù)據(jù),不做修改 else: return response def process_exception(self, request, exception, spider): pass
效果
總結(jié)
-
hro = webdriver.Chrome()
我是直接將Chromedriver寫入配置文件,所以直接實例化對象即可,如果沒有寫入配置文件,寫為hro = webdriver.Chrome(executable_path='絕對路徑')
。嘗試過將Chromedriver放到pycharm的文件下寫入相對路徑,沒有成功。 - 使用selenium在結(jié)束后需要關(guān)閉,可以改寫爬蟲類父類方法closed()
- settings里修改三件套并且打開下載中間件和items
以上就是selenium如何在scrapy中的使用的詳細內(nèi)容,更多關(guān)于scrapy中使用selenium的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Django集成富文本編輯器summernote的實現(xiàn)步驟
在最近的項目中小編使用了這個富文本編輯器,選擇它的主要原因是配置非常簡單,默認支持普通用戶上傳圖片(不像ckeditor默認只有staff user才能上傳圖片。如果要讓普通用戶上傳圖片,還需修改源碼裝飾器)?,F(xiàn)在讓我們來看看如何使用這個富文本編輯器2021-05-05使用Python來開發(fā)Markdown腳本擴展的實例分享
這篇文章主要介紹了使用Python來開發(fā)Markdown腳本擴展的實例分享,文中的示例是用來簡單地轉(zhuǎn)換文檔結(jié)構(gòu),主要為了體現(xiàn)一個思路,需要的朋友可以參考下2016-03-03tensorflow入門之訓(xùn)練簡單的神經(jīng)網(wǎng)絡(luò)方法
本篇文章主要介紹了tensorflow入門之訓(xùn)練簡單的神經(jīng)網(wǎng)絡(luò)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02

python爬蟲使用requests發(fā)送post請求示例詳解