• 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()

  • 相关阅读:
    计算机网络期末复习-Part1
    通过commons-exec实现定时备份数据库
    Leetcode刷题449. 序列化和反序列化二叉搜索树
    Spring参数校验
    RunLoop解析
    java毕业设计希望酒店信息管理系统mybatis+源码+调试部署+系统+数据库+lw
    现在的国产深度deepin操作系统不赖,推荐试用
    调试工具记录
    加解密算法
    Golang不同平台编译的思考
  • 原文地址:https://blog.csdn.net/Qhx20040819/article/details/133443094