赞
踩
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。