requests爬虫百度图片
爬虫是通过访问网络主页,对主页(html)源码进行解析,获取感兴趣信息
如果爬虫批量下载图片,自然利用搜索引擎,对图片进行搜索,对搜索后的主页源码解析
获取图片对应的url,利用该url到服务器端下载图片
其中
1.requests包
requests是一个http的python库
学习资料:
https://docs.python-requests.org/zh_CN/latest/index.html
https://www.liaoxuefeng.com/wiki/1016959663602400/1183249464292448
通过requests包,方便访问解析URL主页
主要有两种方法,get,post获取和发送
下载自然是使用get了
r = requests.get("http://www.baidu.com/")
r.encoding = 'GBK' #使用GBK编码,显示源码内容
r.text 以encoding解析返回html源码内容
r.content 以二进制html源码返回
需要注意的是get请求,可能不通过,在get请求中添加一个header,有助于成功访问到网页
header相当于添加了请求者的信息,让服务器端相信这是一个正常的请求
那一个有效的header是什么样的呢
我们可以通过浏览器查看下一个浏览器发送的header是什么样的
- * 打开网页
- * 按F12
- * F5
- * 点击Network,再点击Doc
- * 点击Headers,查看Request Headers的User-Agent字段
- * 将该字段构造为字典,作为requests的header
User-Agent一般是告诉网站服务器,请求服务的浏览器设备,版本信息等等
2.BeautifulSoup
使用文档:
https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html
接下来就是字符串的检索了,使用re也可以
美丽汤是针对html和xml的解析工具,更加适合我们的工程
基本使用流程:通过文本初始化 bs 对象->通过 find/find_all 或其他方法检测信息->输出或保存
bs需要指定一个解析器:
- html.parse- python 自带,但容错性不够高,对于一些写得不太规范的网页会丢失部分内容
- lxml- 解析速度快,需额外安装
- xml- 同属 lxml 库,支持 XML 文档
- html5lib- 最好的容错性,但速度稍慢
from bs4 import BeautifulSoup as bs soup = bs(r.text,'html.parser')
#通常使用 find 和 find_all 方法进行查找
soup.find_all('***')
soup.find(id='***')
find 和 find_all 可以有多个搜索条件叠加,比如find('a', id='link3', class_='sister')
find 返回的是一个bs4.element.Tag 对象,这个对象可以进一步进行搜索。如果有多个满足的结果,find只返回第一个;如果没有,返回 None。
find_all 返回的是一个由 bs4.element.Tag 对象组成的 list,不管找到几个或是没找到,都是 list。
现在已经有了所有需要的工具,可以爬虫下载图片了
ps: URL 查询字符串, 通过观察url中?后面的参数,结合requests.get的prarm参数,可以实现翻页和定义搜索关键字
稍微修改下,就能很自动啦
# __date__ 2021.8.4 # 爬虫程序,根据关键字,自动下载图片 import requests import os from Spider import Spider from bs4 import BeautifulSoup as bs def main(): det_dir = './' url = 'https://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word=curry' keywords = '' headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", "Accept-Encoding": "gzip, deflate, br", "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7", "Cache-Control": "max-age=0", "Connection": "keep-alive", "sec-ch-ua": '"Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"', } res = requests.get(url+keywords, headers=headers) res.encoding = 'utf-8' soup = bs(res.content,'html.parser') item = soup.find_all(('src')) for indx,i in enumerate(item): try: pic = requests.get(i,timeout=20) except requests.exceptions.ConnectionError: print('error') continue det_img = open(det_dir+indx+'.jpg', 'wb') det_img.write(pic.content) det_img.close() if __name__ == '__main__': main()

浙公网安备 33010602011771号