Python3获取京东商品列表信息,并根据列表信息地址提取信息详情页的相关图片(京东商品详情信息图片采用JS动态加载,需控制网页滚动至一定位置才能加载,初始的静态页面没有商品图片),因此本文采用两种方法加载网页:一种是加载商品列表页(如图1所示),并提取其中的商品列表地址;另一种是根据商品详情页的内容(如图2),控制滚动条滚动至页面底端,确保商品详情图片加载完毕,然后获取网页信息,提取图片地址,最后完成下载,下载流程如图3,主要基于python3采用requests、BeautifulSoup、webdriver包。
代码实现:
第一步:获取商品列表页内容,该页面为静态页面,采用requests包实现,并采用beautifulsoup包筛选网页内容,获取商品详情页地址,代码如下
if __name__=='__main__':
try:
url="https://search.jd.com/Search?keyword=%E9%A3%8E%E8%A1%A3%E7%94%B7&enc=utf-8&suggest=2.def.0.V01--12s0,20s0,38s0,97s0&wq=fengyi&pvid=50ceb61c8ad04e0f9d9ab28abfecbd82"
html=DownLoadImg.GetHtml(url)
soup=BeautifulSoup(html.text,'html.parser')
urls=soup.select('.p-name-type-2>a')
for uu in urls:
itemImg=uu['href']
if itemImg.startswith("//"):
itemImg=itemImg.replace("//","https://").strip()
print(itemImg)
#time.sleep(5)
DownLoadImg.Down(itemImg,'999')
#DownLoadImg.Down('https://item.jd.com/34615071979.html','999')
except Exception as e:
print('chucuo')
raise e
第二步:根据商品详情页地址,采用webdriver包,模拟人工操作(基于谷歌浏览器),将页面滚动至网页底端,加载商品详情相关内容(注:商品详情内容为动态加载,当仅仅打开页面时,商品详情相关内容并不主动加载,因此需人工模拟滚动),代码如下:
# 获取网页源代码,动态内容获取
def get_html_page(url):
try:
driver = webdriver.Chrome(executable_path=driver_path)
driver.get(url)
time.sleep(3)
# 执行页面向下滑至底部的动作
driver.execute_script("window.scrollTo(0,document.body.scrollHeight);")
# 停顿5秒等待页面加载完毕!!!(必须留有页面加载的时间,否则获得的源代码会不完整。)
time.sleep(3)
html_sourcode = driver.page_source
driver.close()
return html_sourcode
except Exception as e:
print(e)
第三步:在模拟人工网页滚动后,根据获取的网页内容,采用beautifulsoup包,筛选网页中图片地址,然后进行下载(本文在代码所在文件夹创建文件夹,将下载图片保存至此)。
#下载新内容所在网页地址
def Down(url,DicName):
req=DownLoadImg.get_html_page(url)
#print(req)
try:
if req=="":
print('网址内容为空')
else:
soup=BeautifulSoup(req,'html.parser')
ll=soup.select('#J-detail-content img[src]')
#print(ll)
#创建存储路径
file_dir=os.getcwd()
file_path=os.path.join(file_dir,DicName)
check_excists=os.path.exists(file_path)
if not check_excists:
os.makedirs(file_path)
count_num=0
for img in ll:
imgurl=img.get('src').strip()
count_num=count_num+1
now_time=datetime.now().strftime('%m%d_%S')
image_name=r"{0}\{1}_image_{2}.jpg".format(file_path,now_time,count_num)
if imgurl.startswith("//"):
imgurl=imgurl.replace("//","http://")
#print(imgurl)
r=requests.get(imgurl,timeout=30)
#print(r)
with open(image_name,'wb') as fw:
fw.write(r.content)
print("save image:{0}".format(count_num))
至此操作完成,本文主要针对网页动态资源进行学习,欢迎探讨,完整代码详见作者上传资源。
参考文档:
https://blog.csdn.net/slhlde/article/details/81937838
https://blog.csdn.net/weixin_38917807/article/details/81386175