当前位置:   article > 正文

python爬取百度图片_写一个从百度抓取图片的代码 python

写一个从百度抓取图片的代码 python

1.查询数据

打开网页。

https://cn.bing.com/images/search?q=%E7%99%BE%E5%BA%A6%E5%9B%BE%E7%89%87&form=HDRSC2&first=1&cw=1585&ch=924

 我们右键查看网页源代码,发现能找到我们需要的img衔接,但是这是一个动态网页。我们每次向下滑动网页,会发现图片更新,而图片更新一般伴随着异步请求。

并且我们打开控制台,如下图所示:

1.点击网络 2.点击Fetch/XHR 

 随着向下滑动:

下图红框异步请求次数增多。

我们将异步请求衔接,在另一个标签页打开。

发现这个异步请求的响应数据有我们需要的图片。

2.请求数据

我们在上面知道是一个动态网页之后,并且找到请求img的地址之后,我们是不是要探寻请求url的规律,发现是如何向下滚动,出现新的图片?

经过查找对比,发现这几个请求参数,新的请求会发生变化。

 然后,我们通过对这几个参数修改进行请求,发现实际起作用的是first。也就是图片起始索引。

另外,q也就是我们搜索的数据进行url编码之后的东西。

3.解析数据

我们找到我们找寻的图片在哪里,但是发现请求响应的是一堆html + css + js代码,因此我们需要对其进行过滤,只找到我们需要的img的url。

我们在打开刚才的那个异步请求url,查看页面源代码。

将前端代码,粘贴到在线 HTML 格式化工具,HTML 代码美化工具 - 在线工具-wetools.com微工具

这个html格式化工具里面,格式化后,将格式化后的代码,粘贴到vscode里面。 

 我们查看代码发现,我们需要img的url,是在下图所示的层级结构里面:

 更往上的html层级结构为:

 因此我们的python爬虫代码可以这样写:

  1. from lxml import etree
  2. import requests
  3. from fake_useragent import UserAgent
  4. if __name__ == '__main__':
  5. headers = {
  6. 'User-Agent': UserAgent().random
  7. }
  8. url = "https://cn.bing.com/images/async?q=%e7%99%be%e5%ba%a6%e5%9b%be%e7%89%87&first=162" \
  9. "&count=35&cw=1177&ch=909&relp=35&apc=0&datsrc=I&layout=RowBased&mmasync=1&dgState=x*740_y*940_h*180_c*3_i*106_r*20&" \
  10. "IG=1EA071CC53E44DFA8101AF041D481594&SFX=4&iid=images.5563"
  11. # 请求响应数据
  12. html = requests.get(url=url,headers=headers).text
  13. p = etree.HTML(html)
  14. img_list = []
  15. # 解析响应数据
  16. ul_list = p.xpath('//ul[@data-row]') # 基准表达式
  17. for ul in ul_list:
  18. li_list = ul.xpath('.//li[@data-idx]')
  19. for li in li_list:
  20. img1_list = list(li.xpath('.//img[contains(@class,"mimg")]/@src'))
  21. img2_list = list(li.xpath('.//img[contains(@class,"cimg")]/@src'))
  22. for img1 in img1_list:
  23. img_list.append(img1)
  24. for img2 in img2_list:
  25. img_list.append(img2)
  26. print(img_list)

4.将图片保存到本地

我们将上述img 衔接,再次进行请求并下载到本地。

  1. # 保存图片
  2. def save_images(self, img_list, dir_path, q):
  3. # 不存在,创建目录
  4. dir_path = dir_path + '/' + q + "/"
  5. if not os.path.exists(dir_path):
  6. os.makedirs(dir_path)
  7. i = 1
  8. for img in img_list:
  9. img_path = '{}{}-{}.jpg'.format(dir_path,q,i)
  10. self.save_image(img_path,img)
  11. i += 1
  12. # 保存图片
  13. def save_image(self,img_path,img):
  14. html = requests.get(url=img,headers=self.get_headers()).content
  15. with open(img_path,'wb') as f:
  16. f.write(html)

4.完整代码

  1. from lxml import etree
  2. import requests
  3. from fake_useragent import UserAgent
  4. from urllib import parse
  5. import os
  6. class BaiduSpider:
  7. def __init__(self):
  8. self.url = "https://cn.bing.com/images/async?q={}&first={}&count=35&cw=1177&ch=909" \
  9. "&relp=35&apc=0&datsrc=I&layout=RowBased&mmasync=1"
  10. # 获取请求头
  11. def get_headers(self):
  12. return {
  13. 'User-Agent': UserAgent().random
  14. }
  15. # 获取响应数据
  16. def get_html(self, q, first):
  17. q = parse.quote(q)
  18. url = self.url.format(q, first)
  19. html = requests.get(url=url, headers=self.get_headers()).text
  20. return html
  21. # 解析响应数据
  22. def parse_html(self, html):
  23. p = etree.HTML(html)
  24. img_list = []
  25. # 基准表达式
  26. ul_list = p.xpath('//ul[@data-row]')
  27. for ul in ul_list:
  28. li_list = ul.xpath('.//li[@data-idx]')
  29. for li in li_list:
  30. img1_list = list(li.xpath('.//img[contains(@class,"mimg")]/@src'))
  31. img2_list = list(li.xpath('.//img[contains(@class,"cimg")]/@src'))
  32. for img1 in img1_list:
  33. img_list.append(img1)
  34. for img2 in img2_list:
  35. img_list.append(img2)
  36. print(img_list)
  37. return img_list
  38. # 保存图片列表
  39. def save_images(self, img_list, dir_path, q):
  40. # 不存在,创建目录
  41. dir_path = dir_path + '/' + q + "/"
  42. if not os.path.exists(dir_path):
  43. os.makedirs(dir_path)
  44. i = 1
  45. for img in img_list:
  46. img_path = '{}{}-{}.jpg'.format(dir_path,q,i)
  47. self.save_image(img_path,img)
  48. i += 1
  49. # 保存图片
  50. def save_image(self,img_path,img):
  51. html = requests.get(url=img,headers=self.get_headers()).content
  52. with open(img_path,'wb') as f:
  53. f.write(html)
  54. # 入口函数
  55. def run(self):
  56. q = input("请输入搜索内容:")
  57. first = int(input("请输入起始页数:"))
  58. dir_path = "../img"
  59. html = self.get_html(q, first)
  60. img_list = self.parse_html(html)
  61. self.save_images(img_list, dir_path, q)
  62. if __name__ == '__main__':
  63. bds = BaiduSpider()
  64. bds.run()

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号