Python3、requests、BeautifulSoup、webdriver下载动态加载的网页图片(包含静态网页获取与动态加载的网页内容获取)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值