当前位置:   article > 正文

Python爬虫 爬取百度图片(使用selenium库web driver实现)_爬取百度搜索的图片selenium

爬取百度搜索的图片selenium

 闲着没事想写一个爬虫去爬取一下百度图片,但是通过连接访问发现返回的是 百度安全验证,然后发现selenium下的web driver可以直接调起浏览器访问网址,并且可以拿到网站内容,所以根据这个写了一个爬虫,代码可以在window上直接运行。

所需第三方库

  1. import time
  2. #用于调起浏览器
  3. from selenium import webdriver
  4. # 用来解析网页内容
  5. from bs4 import BeautifulSoup
  6. import os, requests,re
'
运行

安装第三方库

可以考虑使用阿里云镜像加快安装速度,只需要把bs4换成对应的第三方库就可以。

pip install -i https://mirrors.aliyun.com/pypi/simple/ bs4

观察页面代码,查看自己需要爬去的标签格式

通过F12查看页面源代码可以发现,图片的标签是<img class="main_img img-hover" 标签下,我们需要拿到这个标签里的data-imgurl属性的内容。标题则是在<a class= "imgitem-title "标签下,我们需要title的内容拿来当标题

可以使用 bs4包里的 BeautifulSoup 用来解析网页拿到这两个标签获取我们想要的属性内容

  1. #HTML解析器
  2. b = BeautifulSoup(text, "html.parser")
  3. # 得到页面中所有 img标签并且class是main_img img-hover开头的图片列表
  4. img = b.find_all("img", class_="main_img img-hover")
  5. # 得到页面中所有 a标签并且class是imgitem-title开头的图片标题列表
  6. title = b.find_all("a", class_="imgitem-title")

直接上完整代码,可直接运行

我这里使用的是edge浏览器,如果想使用谷歌,可以把 webdriver.Edge() 换成 webdriver.Chrome();需要注意的是webdriver和浏览器的版本对应不上可能会调不起来。

  1. import time
  2. from selenium import webdriver
  3. from bs4 import BeautifulSoup
  4. import os, requests,re
  5. # 图片存储地址
  6. path = r"D:\pythonTest\photos"
  7. # 正则表达式 过滤并得到图片标题中所有的中文
  8. pattern = '[\u4e00-\u9fa5]+'
  9. def parseHtml(text):
  10. # 因为title标签有很多错误数据,所以记录一下下标
  11. titleIndex = 0;
  12. #HTML解析器
  13. b = BeautifulSoup(text, "html.parser")
  14. # 得到页面中所有 img标签并且class是main_img img-hover开头的图片列表
  15. img = b.find_all("img", class_="main_img img-hover")
  16. # 得到页面中所有 a标签并且class是imgitem-title开头的图片标题列表
  17. title = b.find_all("a", class_="imgitem-title")
  18. # 循环拿到的图片列表,解析标题下载图片
  19. for index, value in enumerate(img):
  20. imageUrl = img[index]["data-imgurl"]
  21. imageName = "default" + str(index)
  22. # 一个循环用于拿到每个图片的正确标题
  23. if len(title) > index:
  24. titleIndex = getImageTitle(title, titleIndex)
  25. imageName = "".join(re.findall(pattern, title[titleIndex].text))
  26. if imageName == "":
  27. imageName = "default" + str(index)
  28. titleIndex += 1
  29. imageName += ".jpg"
  30. print("准备下载第%s个图片,名字叫:%s 地址:%s" % (str(index+1), imageName, imageUrl))
  31. savePhoto(imageUrl, imageName)
  32. # 页面里有很多class=imgitem-title的标签,图片的标题一般有title属性,根据title属性过滤标签
  33. def getImageTitle(title, index):
  34. if "title" in title[index].attrs:
  35. return index
  36. else:
  37. getImageTitle(title, index + 1)
  38. return index + 1
  39. # 保存照片
  40. def savePhoto(imageUrl, filename):
  41. p = os.path.join(path, filename)
  42. c = requests.get(imageUrl)
  43. createFile(path)
  44. with open(p, 'wb') as f:
  45. f.write(c.content)
  46. time.sleep(0.3)
  47. print("下载完了 休息0.3秒")
  48. # 创建本地文件
  49. def createFile(path):
  50. print("path:",path)
  51. file = os.path.exists(path)
  52. if not file:
  53. os.makedirs(path)
  54. # 滑动浏览器窗口,加载更多图片,滑动一次加载20多张图片
  55. # numer为想滑动的次数
  56. def slideBrowseWindow(driver, number):
  57. for i in range(number):
  58. time.sleep(0.1)
  59. driver.execute_script("window.scrollBy(0,{})".format(i * 1000))
  60. time.sleep(0.3)
  61. if __name__ == "__main__":
  62. #这里的豪车可以改成自己想搜索的内容
  63. searchName = "豪车"
  64. #这里使用的是edge浏览器,如果想使用谷歌浏览器,可以换成webdriver.Chrome()
  65. driver = webdriver.Edge()
  66. driver.get("https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1709260324755_R&pv=&ic=&nc=1&z=&hd=&latest=&copyright=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&dyTabStr=MCwxLDMsMiw4LDYsNCw1LDcsOQ%3D%3D&ie=utf-8&sid=&word="+ searchName +"&f=3&oq=%E7%BE%8E%E5%A5%B3&rsp=0")
  67. # 百度图片是下滑加载更多
  68. slideBrowseWindow(driver, 10)
  69. # 获取页面的源代码
  70. page_source = driver.page_source
  71. # 输出页面源代码
  72. parseHtml(page_source)
  73. driver.quit()
  74. print("done.")

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/801100
推荐阅读
相关标签
  

闽ICP备14008679号