目标地址: http://image.baidu.com/
输入美女

分析网址
元网址见图

粘贴过来却如下
(在这里你会看到,明明在浏览器URL栏看到的是中文,但是复制url,粘贴到记事本或代码里面,就会变成如下这样???)

https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1610771025434_R&pv=&ic=&nc=1&z=&hd=&latest=&copyright=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&sid=&word=%E7%BE%8E%E5%A5%B3

在很多网站的URL中对一些get的参数或关键字进行编码,所以我们复制出来的时候,会出现问题。

URL的编码和解码

import urllib
from urllib import parse
import urllib.requestdata = {'word': '美女'}# Python3的urlencode需要从parse中调用,可以看到urlencode()接受的是一个字典
print(urllib.parse.urlencode(data))
# 通过urllib.request.unquote()方法,把URL编码字符串,转换回原先字符串
print(urllib.request.unquote('word=%E7%BE%8E%E5%A5%B3'))

分析源代码
F12或者页面上右键审查元素。打开以后,定位到图片的位置

复制下面这个网址
注意有转义字符

imgurl="https:\/\/ss0.bdstatic.com\/70cFvHSh_Q1YnxGkpoWK1HF6hhy\/it\/u=2718853745,1288801299&fm=214&gp=0.jpg"

然后在当前网页的空白地方右键:查看网页源代码
使用快捷键CTRl+F
查找(我这里 输入 gp=0.jpg 通过输入图片网址最后几个字符来定位图片)

这个图片怎么有很多地址,到底用哪个呢?可以看到有thumbURL,objURL等等。
通过分析可以知道,前面两个是缩小的版本,hover是鼠标移动过后显示的版本,objURL对应的那个地址,应该是我们需要的,不信可以打开这几个网址看看,发现obj那个最大最清晰。

编写正则表达式或者XPath表达式

pic_url = re.findall(’“objURL”:"(.*?)",’,html,re.S)

objurl后面的,全匹配

找到本机电脑网络的headers
有的时候,我们无法爬取一些网页,会出现403错误,因为这些网页为了防止别人恶意采集信息所以进行了一些反爬虫的设置。
我们可以设置一些Headers信息,模拟成浏览器去访问这些网站,就能解决这个问题。
首先,单击网页中的百度一下,即让网页发生一个动作,下方窗口出现了很多数据,如图。

此时单击图中的www.baidu.com,出现如图

在Headers,往下拖动,找到User-agent
这一串信息就是我们下面模拟浏览器用到的信息,复制出来。

所有代码
语言python

from urllib.parse import quote
import string
import re
from urllib import request
import  urllib.request
word = input('关键词:')
url = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=' + word + '&ct=201326592&v=flip'
url = quote(url, safe=string.printable)# # 解决ascii编码报错问题,不报错则可以注释掉
#模拟成浏览器
headers=("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36")
opener=urllib.request.build_opener()
opener.addheaders=[headers]
#将opener安装为全局
urllib.request.install_opener(opener)
#读取网页url_request=request.Request(url)
url_response = request.urlopen(url_request,timeout=10)   # 请求数据,可以和上一句合并.表示一次http访问请求的时间最多10秒,一旦超过,本次请求中断,但是不进入下一条,而是继续重复请求这一条
html = url_response.read().decode('utf-8')  # 加编码,重要!转换为字符串编码,read()得到的是byte格式的。jpglist = re.findall('"thumbURL":"(.*?)",',html,re.S)    #re.S将字符串作为整体,在整体中进行匹配。,thumbURL可以匹配其他格式的图
print(len(jpglist))
n = 1
for each in jpglist:print(each)try:request.urlretrieve(each,'D:\\deeplearn\\xuexicaogao\\图片\\%s.jpg' %n) #爬下载的图片放置在提前建好的文件夹里except Exception as e:print(e)finally:print('下载完成。')n+=1if n==90:break
print('结束')

代码解析
爬虫报错UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 45-47: ordinal not…
原因 python 默认的编码是ascii,当程序中出现非ascii编码时,python的处理常常会报这样的错UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0x?? in position 1: ordinal not in range(128),python没办法处理非ascii编码的,此时需要自己设置将python的默认编码,一般设置为utf8的编码格式。
使用urllib.parse.quote进行转换。

结果文件夹

代码版本2
语言python

import urllib
import urllib.request
from urllib.parse import quote
import re
import osheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36","referer": "https://image.baidu.com"
}
print("****************************************************************************************")
keyword = input("请输入要下载的图片:")
last_dir = "C://Users//Shineion//Desktop//爬虫图"
dir = "C://Users//Shineion//Desktop//爬虫图//" + keyword
if os.path.exists(last_dir):if os.path.exists(dir):print("文件夹已经存在")else:os.mkdir(dir)print(dir + "已经创建成功")
else:os.mkdir(last_dir)if os.path.exists(dir):print("文件夹已经存在")else:os.mkdir(dir)print(dir + "已经创建成功")
keyword1 = quote(keyword, encoding="utf-8")
url = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=' + keyword1 + '&ct=201326592&v=flip'
req = urllib.request.Request(url, headers=headers)
f = urllib.request.urlopen(req).read().decode("utf-8")
key = r'thumbURL":"(.+?)"'
key1 = re.compile(key)
num = 0
for string in re.findall(key1, f):print("正在下载" + string)f_req = urllib.request.Request(string, headers=headers)f_url = urllib.request.urlopen(f_req).read()fs = open(dir + "/" + keyword + str(num) + ".jpg", "wb+")fs.write(f_url)fs.close()num += 1print(string + "已下载成功")
input("按任意键结束程序:")

注意问题:代码容易卡住,在获取某一图片时卡住

作者:电气-余登武

爬虫实战:通过百度关键词爬取大量图片相关推荐

  1. python爬虫实战之百度新闻爬取

    百度新闻信息爬取 目录 百度新闻信息爬取 序言 获取在百度新闻中搜索"阿里巴巴"的网页源代码 编写正则表达式提取新闻信息 数据清洗并打印输出 实战完整代码 序言  通过对百度新闻标 ...

  2. Python爬虫实战系列(一)-request爬取网站资源

    Python爬虫实战系列(一)-request爬取网站资源 python爬虫实战系列第一期 文章目录 Python爬虫实战系列(一)-request爬取网站资源 前言 一.request库是什么? 二 ...

  3. Python 爬虫实战,模拟登陆爬取数据

    Python 爬虫实战,模拟登陆爬取数据 从0记录爬取某网站上的资源连接: 模拟登陆 爬取数据 保存到本地 结果演示: 源网站展示: 爬到的本地文件展示: 环境准备: python环境安装 略 安装r ...

  4. 初探Scrapy爬虫框架之百度网页爬取

    初探Scrapy爬虫框架之百度网页爬取 scrapy框架及百度网页爬取与保存 一.scrapy框架简介 二.自己初使用的心得体会 1.爬虫之前明确目标 2.scrapy框架的简单使用流程 3.scra ...

  5. python爬虫实战(一)--爬取知乎话题图片

    原文链接python爬虫实战(一)–爬取知乎话题图片 前言 在学习了python基础之后,该尝试用python做一些有趣的事情了–爬虫. 知识准备: 1.python基础知识 2.urllib库使用 ...

  6. Python爬虫实战之一 - 基于Requests爬取拉勾网招聘信息,并保存至本地csv文件

    Python爬虫实战之二 - 基于Requests抓取拉勾网招聘信息 ---------------readme--------------- 简介:本人产品汪一枚,Python自学数月,对于小白,本 ...

  7. 爬虫实战(二) 用Python爬取网易云歌单

    最近,博主喜欢上了听歌,但是又苦于找不到好音乐,于是就打算到网易云的歌单中逛逛 本着 "用技术改变生活" 的想法,于是便想着写一个爬虫爬取网易云的歌单,并按播放量自动进行排序 这篇 ...

  8. 用python 爬取百度百科内容-爬虫实战(一) 用Python爬取百度百科

    最近博主遇到这样一个需求:当用户输入一个词语时,返回这个词语的解释 我的第一个想法是做一个数据库,把常用的词语和词语的解释放到数据库里面,当用户查询时直接读取数据库结果 但是自己又没有心思做这样一个数 ...

  9. 爬虫实战——绝对通俗易懂,爬取房产数据

    爬取房产数据 爬虫介绍 实战目标 1.获取url 2.利用BeautifulSoup获取html的索引 3.查找所需数据索引 4.正则表达式获取所需要的信息 完整代码 爬虫介绍 简单介绍一下爬虫,百度 ...

最新文章

  1. 人脸识别机器学习实战
  2. python3.6 - threading 多线程编程进阶,线程间并发控制(2)
  3. 企业推广OA信息化三大法宝
  4. SAP C4C url mashup跳转原理 - C4C UI到Mashup的参数传递是如何进行的
  5. JAVA-Lambda表达式
  6. 各种触发器的特性方程_薛定谔方程,究竟神奇在哪里?
  7. 华为机试HJ35:蛇形矩阵
  8. Spectra Logic磁带库成SGI方案中标准化产品
  9. asp.net DataTable导出 excel的方法记录(第三方)
  10. 360搜集隐私程序员级分析,供方舟子及大众参考
  11. jsp15公安海警学院值班管理系统(jsp+servlet+mysql)
  12. 社会网络分析能干什么?
  13. html和jsp轮播,jsp页面、图片轮播
  14. SpringBoot启动完之后自动打开浏览器网址
  15. 关于职业选择讲座的笔记
  16. GNU Radio: 射频子板
  17. android如何拨打电话
  18. Unity SKFramework框架(二十五)、RSA算法加密、签名工具 RSA Crypto
  19. ES6新特性总结(2)解构赋值、模板字符串、Symbol
  20. 当我跑步时,我在想什么

热门文章

  1. spring boot+shiro中使用@RequiresRoles不生效,访问报错404
  2. 牛客题霸 NC22 合并两个有序的数组
  3. TensorFlow 2——替换【tensorflow.compat.v1.contrib.rnn.LSTMCell】解决方案
  4. CG CTF WEB 密码重置2
  5. CG CTF WEB 密码重置
  6. CCPC2019-湖南全国邀请赛(湘潭大学)
  7. Minimum Triangulation
  8. android 二级列表拖动排序_Excel的数据透视表六种排序方法
  9. 计算机网络(谢希仁第八版)第二章:物理层
  10. 微信小程序php后台支付,微信小程序 支付功能实现PHP实例详解