人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動(dòng)態(tài)

selenium在scrapy中的使用代碼

發(fā)布日期:2022-04-12 10:41 | 文章來源:gibhub

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

使用目的

爬取網(wǎng)易新聞國內(nèi)、國際、軍事、航空4個(gè)版塊的新聞。在測試中發(fā)現(xiàn)各版塊的新聞是動(dòng)態(tài)加載的,如果直接爬取無法獲取,使用selenium幫助獲取此部分?jǐn)?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個(gè)版塊
  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ù)解析:新聞標(biāo)題+新聞詳情頁的url(動(dòng)態(tài)加載數(shù)據(jù))
 def parse_model(self,response):
  # 直接對response解析無法獲取該數(shù)據(jù)(動(dòng)態(tài)加載數(shù)據(jù))
  # 無法拿到動(dòng)態(tài)加載數(shù)據(jù)返回的響應(yīng)數(shù)據(jù)就不足
  # 使用中間件修改不滿足需求的響應(yīng)對象中的響應(yīng)數(shù)據(jù),將其改為包含動(dòng)態(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)對象
 # 整個(gè)工程發(fā)起的請求:1+4+n 對應(yīng)相同的響應(yīng)
 def process_response(self, request, response, spider):
  # 從所有攔截對象中找到4個(gè)需修改的響應(yīng)對象
  if request.url in spider.model_url:
hro = spider.hro
hro.get(request.url)
sleep(2)
# 網(wǎng)頁下拉到底,獲取更多動(dò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
# 返回一個(gè)新的響應(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寫入配置文件,所以直接實(shí)例化對象即可,如果沒有寫入配置文件,寫為hro = webdriver.Chrome(executable_path='絕對路徑')。嘗試過將Chromedriver放到pycharm的文件下寫入相對路徑,沒有成功。
  • 使用selenium在結(jié)束后需要關(guān)閉,可以改寫爬蟲類父類方法closed()
  • settings里修改三件套并且打開下載中間件和items

以上就是selenium如何在scrapy中的使用的詳細(xì)內(nèi)容,更多關(guān)于scrapy中使用selenium的資料請關(guān)注本站其它相關(guān)文章!

美國穩(wěn)定服務(wù)器

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開通

自選配置、實(shí)時(shí)開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部