主頁 > 知識庫 > selenium在scrapy中的使用代碼

selenium在scrapy中的使用代碼

熱門標簽:開封自動外呼系統(tǒng)怎么收費 400電話辦理哪種 地圖標注線上如何操作 應電話機器人打電話違法嗎 河北防封卡電銷卡 開封語音外呼系統(tǒng)代理商 電銷機器人的風險 手機網頁嵌入地圖標注位置 天津電話機器人公司

在通過scrapy框架進行某些網站數(shù)據(jù)爬取的時候,往往會碰到頁面動態(tài)數(shù)據(jù)加載的情況發(fā)生,如果直接使用scrapy對其url發(fā)請求,是絕對獲取不到那部分動態(tài)加載出來的數(shù)據(jù)值。但是通過觀察我們會發(fā)現(xiàn),通過瀏覽器進行url請求發(fā)送則會加載出對應的動態(tài)加載出的數(shù)據(jù)。那么如果我們想要在scrapy也獲取動態(tài)加載出的數(shù)據(jù),則必須使用selenium創(chuàng)建瀏覽器對象,然后通過該瀏覽器對象進行請求發(fā)送,獲取動態(tài)加載的數(shù)據(jù)值。本文重點給大家介紹selenium在scrapy中的使用,具體內容如下所示:

使用目的

爬取網易新聞國內、國際、軍事、航空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ù)返回的響應數(shù)據(jù)就不足
        # 使用中間件修改不滿足需求的響應對象中的響應數(shù)據(jù),將其改為包含動態(tài)加載數(shù)據(jù)的響應數(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):
        # 返回的列表,需要將其轉換為字符串
        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í)行結束后立即執(zhí)行
    def closed(self,spider):
        # 打開selenium需要關閉
        self.hro.quit()

middlewares

from time import sleep
from scrapy.http import HtmlResponse#scrapy封裝好的響應類

class WangyiproDownloaderMiddleware:


    def process_request(self, request, spider):

        return None

    # 攔截所有的響應對象
    # 整個工程發(fā)起的請求:1+4+n 對應相同的響應
    def process_response(self, request, response, spider):
        # 從所有攔截對象中找到4個需修改的響應對象
        if request.url in spider.model_url:
            hro = spider.hro
            hro.get(request.url)
            sleep(2)
            # 網頁下拉到底,獲取更多動態(tài)加載數(shù)據(jù)
            hro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
            sleep(1)
            page_text = hro.page_source
            # response.text = page_text
            # 返回一個新的響應對象
            return HtmlResponse(url=request.url,body=page_text,encoding='utf-8',request=request)

        # 如果不是需要修改的響應數(shù)據(jù),不做修改
        else:
            return response

    def process_exception(self, request, exception, spider):

        pass

效果

總結

  •  hro = webdriver.Chrome() 我是直接將Chromedriver寫入配置文件,所以直接實例化對象即可,如果沒有寫入配置文件,寫為hro = webdriver.Chrome(executable_path='絕對路徑')。嘗試過將Chromedriver放到pycharm的文件下寫入相對路徑,沒有成功。
  • 使用selenium在結束后需要關閉,可以改寫爬蟲類父類方法closed()
  • settings里修改三件套并且打開下載中間件和items

以上就是selenium如何在scrapy中的使用的詳細內容,更多關于scrapy中使用selenium的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • Scrapy+Selenium自動獲取cookie爬取網易云音樂個人喜愛歌單
  • 如何在scrapy中集成selenium爬取網頁的方法
  • scrapy與selenium結合爬取數(shù)據(jù)(爬取動態(tài)網站)的示例代碼
  • scrapy結合selenium解析動態(tài)頁面的實現(xiàn)
  • scrapy利用selenium爬取豆瓣閱讀的全步驟
  • python網絡爬蟲 Scrapy中selenium用法詳解
  • Scrapy基于selenium結合爬取淘寶的實例講解

標簽:常州 山東 六盤水 宿遷 駐馬店 成都 蘭州 江蘇

巨人網絡通訊聲明:本文標題《selenium在scrapy中的使用代碼》,本文關鍵詞  selenium,在,scrapy,中的,使用,;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《selenium在scrapy中的使用代碼》相關的同類信息!
  • 本頁收集關于selenium在scrapy中的使用代碼的相關信息資訊供網民參考!
  • 推薦文章