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

 

posted @ 2021-08-11 21:43  cc_master  阅读(175)  评论(0)    收藏  举报