異步加載的網頁,解決辦法
親們:作爲一名測試人員,時不時的客串下別的角色亦是我的工作職責。公司需要爬取京東部分數據,不可避免的會遇到技術問題。廢話不多說,說下異步加載怎樣應對。
科普一下先,老鳥請跳過。異步加載也叫非阻塞模式加載,瀏覽器在下載js的同時,同時還會執行後續的頁面處理。簡單的來講,beautifulsoup解析的html文件,與在瀏覽器中網頁呈現的html並不完全一致(尤其是商品價格,商品名稱等等),你就可以認爲是異步加載。(實際並非如此,還有可能是延遲加載,異步加載就是併發請求html內容,我暫時是這樣理解的)
來,步入正題。
我目前知道兩種解決異步加載的辦法,我採用的是第二種解決辦法。
辦法一
瀏覽器打開異步加載的網頁,按f12,查看網絡中的xhr。假如當前異步加載的網址是www.baidu.com,你在刷新的時候,查看xhr中的內容,你會發現,你本來只打算請求一下(大部分都這麼覺得),實際卻發出了很多個請求。仔細看xhr中這些 請求的響應或者json,你就能發現在這些併發的請求中,有你想要得到的數據。具體怎樣操作,根據你的業務需求組織即可。這個我是純屬理論中的,並沒有實踐。
辦法二
selenium獲取異步加載後的html文件。因爲我是測試,對selenium並不陌生,所以我選擇這種方法。操作步驟爲:1,selenium指定瀏覽器;2,瀏覽器打開異步加載網頁;3,獲取html文件。代碼如下
driver = webdriver.Firefox()
driver.get("https://list.jd.com/list.html?cat=12218,13553,13576&page=%d&delivery=1"%page)
time.sleep(2)
a = driver.page_source #a即是異步加載完成的html文件,注意,如果網絡不好,請將等待時間延長或者刷新後重試
下面將我的代碼貼出來,並沒有做處理,臨時腳本
#__author__ = 'chubby_superman'
#_*_coding=utf-8 _*
from selenium import webdriver
from bs4 import BeautifulSoup
import openpyxl
import time
from compiler.ast import flatten
def h5_se(page):
driver = webdriver.Firefox()
try :
driver.get("https://list.jd.com/list.html?cat=12218,13553,13576&page=%d&delivery=1"%page)
driver.refresh()
time.sleep(2)
except Exception as e:
pass
time.sleep(2)
a = driver.page_source
driver.close()
return a #a即是我想要的異步加載完成後的html文件
#beautifulsoup定位我要的數據
def sku(soup):
#獲取sku
sku1 = soup.select('li.gl-item div.gl-i-wrap.j-sku-item')
sku = []
for i in sku1:
i=i["data-sku"]
sku.append(i)
#獲取商品名稱
name1 = soup.select("li.gl-item div.gl-i-wrap.j-sku-item div.p-name a em")
name = []
for i in name1:
i=i.getText()
name.append(i)
#獲取價格
price1 = soup.select("li.gl-item div.gl-i-wrap.j-sku-item div.p-price strong.J_price.js_ys i")
price = []
for i in price1:
i = i.get_text()
price.append(i)
#獲取商品標籤。例:京東自營,滿減,滿贈,放心購,險等等
goods_label= soup.select("li.gl-item div.gl-i-wrap.j-sku-item div.p-icons.J-pro-icons")
goods_labels=[]
for i in goods_label:
i = i.getText()
goods_labels.append(i)
return sku,name,price,goods_labels
a = []
for i in range(1):
soup = BeautifulSoup(h5_se(i+1),"lxml")
a.append(sku(soup))
c = []
#數據處理
for i in range(len(a)):
for j in range(len(a[i])):
c.append(a[i][j])
sku=[]
name = []
pr = []
biao =[]
for i in range(len(c)+1):
if i%4==1:
sku.append(c[i-1])
elif i%4==2:
name.append(c[i-1])
elif i%4==3:
pr.append(c[i-1])
else:
if i ==0:
pass
else:
biao.append(c[i-1])
sku = [g for i in sku for g in i]
name = [g for i in name for g in i]
pr = [g for i in pr for g in i]
biao = [g for i in biao for g in i]
data = [sku,name,pr,biao]
#寫入xlsx文件
workbook=openpyxl.load_workbook(r"E:\test\jaasdf.xlsx")
sheet = workbook.get_active_sheet()
for i in range(len(data)):
for j in range(len(data[i])):
sheet.cell(row =j+1,column =i+1,value =data[i][j])
workbook.save("jaasdf.xlsx")
精力有限,如有疏漏歡迎指正。如需探討問題請私信聯繫本人,我是胖超人。