异步加载的网页,解决办法
亲们:作为一名测试人员,时不时的客串下别的角色亦是我的工作职责。公司需要爬取京东部分数据,不可避免的会遇到技术问题。废话不多说,说下异步加载怎样应对。
科普一下先,老鸟请跳过。异步加载也叫非阻塞模式加载,浏览器在下载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")
精力有限,如有疏漏欢迎指正。如需探讨问题请私信联系本人,我是胖超人。