Python 爬虫系列教程一爬取批量百度图片

原文地址:https://blog.csdn.net/qq_40774175/article/details/81273198

很久之前就学习了Python的爬虫了,也用来做过一些项目(主要是一些课程项目),但时间比较紧,一直没有空把它写下来,这个暑假,我可能会逐渐更新Python爬虫的相关知识。

项目1:实现批量爬取百度图片

先简单的介绍下这个项目。当你需要下载大量图片的时候,或许你会去百度图片里一张张右键下载,但这样未免太麻烦了,有了这个工具,你直接运行下程序,输入你想要下载图片的关键字,然后输入你想要下载图片的数量,你就成功下载图片了!

下面给下演示程序的截图:

几秒钟后,我去C盘文件夹下,就有了30张,张天爱的图片啦!

是不是觉得,这样下载起来比较方便........

好了,言归正传,下面开始一步步教大家,怎么实现它!

1. Python的IDE,我想大家应该都有吧,我用的是pycharm,大家可以去官网上下载,这里顺带给大家推荐一个免费试用它的方法,当然,仅限于在校大学生(如果你是高中生的话,可能需要麻烦一点,去百度找注册码,大概每个月会更新一次的样子)

首先,你先到jetBrains 官网,官网链接在这!打开后。

你点击右上角的人物标志,进入账号登录页面。

之后,你在打开这个注册账号的链接:学生账号注册链接,

点击立即申请!

你会进入这个页面:

这里需要一个学校的公邮,这个公邮去哪里找呢?你可以去你所在学校的官网找找,每个在校大学生都可以申请200个学校公邮的(反正我们学校是这样),你可以搜索你们学校的邮箱系统,去查看具体怎么申请,每个学校可能不同。

申请好了以后,你在回到一开始让你进入的登录页面,登录以后,就可以免费下载使用了。

2 .安装爬虫需要的包

 (1)如果你使用的是pycharm,那么你安装包会非常的方便,在pycharm里找的Terminal 点击,输入pip install ....就可以安装包了,当然如果是你首次运行的话,可能需要你更新pip工具,这你最好去官网重新下载下pip,这样你以后会很方便,这里就不在具体讲怎么更新pip了,以后有时间在写写吧。

 (2) 依次键入pip install BeautifulSoup  

                         pip insatll requests

                         pip install  lxml 

 (3)下面将分别介绍他们的用途:

   BeautifulSoup 是用来获取一个页面里面的各个标签及里面的内容,我们主要用到它里面的find(),find_All()函数,具体用法将在后面一一介绍

  requests 是用来获取网页信息的,也就是说,我们给它一个url,它能把这个url对应的页面信息全部反馈给我们,这时候我们在用beautifulSoup里的函数对他们进行处理

lxml 是一个解析器,python里有专门的解析器,html.parser,但是lxml的解析速度优于html_parser,所以建议使用lxml

3. Python正则表达式基础

  要想提升写爬虫的能力,那么你必须学会正则表达式,它可以让你用简短的代码实现你想要的功能。

详细的知识,可以到这里去看.python 正则表达式

下面我会介绍,本次项目里使用到的技巧:

首先你先打开百度图片 ,也就是这个页面 百度图片

然后,你可以随便输入你想要查看的图片....(不好意思,我还是输入了,zhang tian ai)

 

注意:先点击右上角,切换成传统翻页版,因为这样有利于我们爬取图片!这里一定要注意,很多网友问我,为啥他打开百度图片,每一页不是60张图片。因为你直接打开的网页,不便于翻页操作,并且每一页的图片数量不相同。所以,我选择爬取的方法是,从传统翻页版爬取图片。

接着,你右键检查网页源代码(如果你用的是谷歌浏览器),那么你可以在里面直接搜索 objURL 或者URL

现在我们发现了我们需要图片的url了,现在,我们要做的就是将这些信息爬取出来(网页中有objURL,hoverURL...但是我们用的是objURL,因为这个是原图),如何获取objURL?当然你可以暴力写个程序跑一遍,但是这程序写起来.....

那我们该如何用正则表达式实现呢?其实只需要一行代码.....

就是这么简单,我想你如果看了正则表达式,一定可以轻松的写出或者理解这句话。

经过我的实验,我发现传统翻页版的百度图片,每一页有60张图片。这也是为啥后面我写代码,用了t+60。

4 . BeautifulSoup知识介绍

同样的我先给出文档链接,具体细节大家自己研究,我这里只介绍这个项目用到的知识。BeautifulSoup 文档

我们主要用到的是find()和find_All()函数:

5. requests 介绍

requests文档

requests博大精深,我们这里只不过是用了它的一个功能而已。

html = requests.get(url) 我们将url传进去,它就会得到这个url里面的信息,具体的,大家可以在python里运行试试.

6. 项目实现思路

 首先需要写一个下载图片的函数,其次还有检测图片数量的函数,还有最后的推荐函数(推荐函数,主要是根据你键入的文本,在百度图片里找到相似的内容,返回给用户,类似于百度搜索的最下面)

首先是图片下载函数:下面是部分代码

具体思路就是根据正则表达式,找到url,然后完成下载。

 

其次是推荐函数:

推荐函数,主要公能是把百度的相关搜索提示返回给用户,实现很简单,但需要注意编码的问题(关于python编码格式的问题,我觉得能写10000字,以后有空再慢慢写吧)。

还有是检测图片数量函数,它的主要思路是通过计算能翻的页数来估算总数量,比如一个页面有20张图片,那么我点下一页50次,那么就说明有1000张图片....虽然这样很傻(哈哈)

因为有些图片可能有很多张(估计要翻页10000多次),所以为了能在几秒内下载好图片,我把图片是上限设为了1020张,也就是说即使有100000张图片,我也就先告诉你只有1020张(当然你也可以把它设置为无限,可能会慢一点)

7 主函数

主函数主要是一些逻辑上的问题,为的就是让用户使用更便捷而已,具体我就不一一解释,我想大家看源码比看我写 的文字更有感觉。

之前会出现下载重复的bug,现在已经解决了。

8 源代码:

  1. import re
  2. import requests
  3. from urllib import error
  4. from bs4 import BeautifulSoup
  5. import os
  6. num = 0
  7. numPicture = 0
  8. file = ''
  9. List = []
  10. def Find(url):
  11. global List
  12. print('正在检测图片总数,请稍等.....')
  13. t = 0
  14. i = 1
  15. s = 0
  16. while t < 1000:
  17. Url = url + str(t)
  18. try:
  19. Result = requests.get(Url, timeout=7)
  20. except BaseException:
  21. t = t + 60
  22. continue
  23. else:
  24. result = Result.text
  25. pic_url = re.findall('"objURL":"(.*?)",', result, re.S) # 先利用正则表达式找到图片url
  26. s += len(pic_url)
  27. if len(pic_url) == 0:
  28. break
  29. else:
  30. List.append(pic_url)
  31. t = t + 60
  32. return s
  33. def recommend(url):
  34. Re = []
  35. try:
  36. html = requests.get(url)
  37. except error.HTTPError as e:
  38. return
  39. else:
  40. html.encoding = 'utf-8'
  41. bsObj = BeautifulSoup(html.text, 'html.parser')
  42. div = bsObj.find('div', id='topRS')
  43. if div is not None:
  44. listA = div.findAll('a')
  45. for i in listA:
  46. if i is not None:
  47. Re.append(i.get_text())
  48. return Re
  49. def dowmloadPicture(html, keyword):
  50. global num
  51. # t =0
  52. pic_url = re.findall('"objURL":"(.*?)",', html, re.S) # 先利用正则表达式找到图片url
  53. print('找到关键词:' + keyword + '的图片,即将开始下载图片...')
  54. for each in pic_url:
  55. print('正在下载第' + str(num + 1) + '张图片,图片地址:' + str(each))
  56. try:
  57. if each is not None:
  58. pic = requests.get(each, timeout=7)
  59. else:
  60. continue
  61. except BaseException:
  62. print('错误,当前图片无法下载')
  63. continue
  64. else:
  65. string = file + r'\\' + keyword + '_' + str(num) + '.jpg'
  66. fp = open(string, 'wb')
  67. fp.write(pic.content)
  68. fp.close()
  69. num += 1
  70. if num >= numPicture:
  71. return
  72. if __name__ == '__main__': # 主函数入口
  73. word = input("请输入搜索关键词(可以是人名,地名等): ")
  74. #add = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E5%BC%A0%E5%A4%A9%E7%88%B1&pn=120'
  75. url = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=' + word + '&pn='
  76. tot = Find(url)
  77. Recommend = recommend(url) # 记录相关推荐
  78. print('经过检测%s类图片共有%d张' % (word, tot))
  79. numPicture = int(input('请输入想要下载的图片数量 '))
  80. file = input('请建立一个存储图片的文件夹,输入文件夹名称即可')
  81. y = os.path.exists(file)
  82. if y == 1:
  83. print('该文件已存在,请重新输入')
  84. file = input('请建立一个存储图片的文件夹,)输入文件夹名称即可')
  85. os.mkdir(file)
  86. else:
  87. os.mkdir(file)
  88. t = 0
  89. tmp = url
  90. while t < numPicture:
  91. try:
  92. url = tmp + str(t)
  93. result = requests.get(url, timeout=10)
  94. print(url)
  95. except error.HTTPError as e:
  96. print('网络错误,请调整网络后重试')
  97. t = t+60
  98. else:
  99. dowmloadPicture(result.text, word)
  100. t = t + 60
  101. print('当前搜索结束,感谢使用')
  102. print('猜你喜欢')
  103. for re in Recommend:
  104. print(re, end=' ')

好了,就先写这么多。欢迎大家转载。如有问题,欢迎给我留言。

 

 

2019年4月2日  第3次更新

这次有网友想要爬取大量的图片作为训练材料。他想要300种不同的图片,每种100张,如果还是按之前的代码去运行,就需要他输入300次图片的名称,这样是非常浪费时间的。所以这里对代码进行一些改进,你只需要把你想要爬取图片的名称,编辑到一个txt文件,然后输入你需要的数量就行。

 

使用方法:

首先将你需要下载的图片名称写到一个txt文本上,文本的名字叫name即可。

按行输入,每行放一个名字。

将name.txt放入和你当前python文件同一目录下即可。

 

代码:

  1. import re
  2. import requests
  3. from urllib import error
  4. from bs4 import BeautifulSoup
  5. import os
  6. num = 0
  7. numPicture = 0
  8. file = ''
  9. List = []
  10. def Find(url):
  11. global List
  12. print('正在检测图片总数,请稍等.....')
  13. t = 0
  14. i = 1
  15. s = 0
  16. while t < 1000:
  17. Url = url + str(t)
  18. try:
  19. Result = requests.get(Url, timeout=7)
  20. except BaseException:
  21. t = t + 60
  22. continue
  23. else:
  24. result = Result.text
  25. pic_url = re.findall('"objURL":"(.*?)",', result, re.S) # 先利用正则表达式找到图片url
  26. s += len(pic_url)
  27. if len(pic_url) == 0:
  28. break
  29. else:
  30. List.append(pic_url)
  31. t = t + 60
  32. return s
  33. def recommend(url):
  34. Re = []
  35. try:
  36. html = requests.get(url)
  37. except error.HTTPError as e:
  38. return
  39. else:
  40. html.encoding = 'utf-8'
  41. bsObj = BeautifulSoup(html.text, 'html.parser')
  42. div = bsObj.find('div', id='topRS')
  43. if div is not None:
  44. listA = div.findAll('a')
  45. for i in listA:
  46. if i is not None:
  47. Re.append(i.get_text())
  48. return Re
  49. def dowmloadPicture(html, keyword):
  50. global num
  51. # t =0
  52. pic_url = re.findall('"objURL":"(.*?)",', html, re.S) # 先利用正则表达式找到图片url
  53. print('找到关键词:' + keyword + '的图片,即将开始下载图片...')
  54. for each in pic_url:
  55. print('正在下载第' + str(num + 1) + '张图片,图片地址:' + str(each))
  56. try:
  57. if each is not None:
  58. pic = requests.get(each, timeout=7)
  59. else:
  60. continue
  61. except BaseException:
  62. print('错误,当前图片无法下载')
  63. continue
  64. else:
  65. string = file + r'\\' + keyword + '_' + str(num) + '.jpg'
  66. fp = open(string, 'wb')
  67. fp.write(pic.content)
  68. fp.close()
  69. num += 1
  70. if num >= numPicture:
  71. return
  72. if __name__ == '__main__': # 主函数入口
  73. tm = int(input('请输入每类图片的下载数量 '))
  74. numPicture = tm
  75. line_list = []
  76. with open('./name.txt', encoding='utf-8') as file:
  77. line_list = [k.strip() for k in file.readlines()] # 用 strip()移除末尾的空格
  78. for word in line_list:
  79. url = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=' + word + '&pn='
  80. tot = Find(url)
  81. Recommend = recommend(url) # 记录相关推荐
  82. print('经过检测%s类图片共有%d张' % (word, tot))
  83. file = word + '文件'
  84. y = os.path.exists(file)
  85. if y == 1:
  86. print('该文件已存在,请重新输入')
  87. file = word+'文件夹2'
  88. os.mkdir(file)
  89. else:
  90. os.mkdir(file)
  91. t = 0
  92. tmp = url
  93. while t < numPicture:
  94. try:
  95. url = tmp + str(t)
  96. result = requests.get(url, timeout=10)
  97. print(url)
  98. except error.HTTPError as e:
  99. print('网络错误,请调整网络后重试')
  100. t = t + 60
  101. else:
  102. dowmloadPicture(result.text, word)
  103. t = t + 60
  104. numPicture = numPicture + tm
  105. print('当前搜索结束,感谢使用')

 

如遇到bug或者有新的需求,可以给我留言,或者微信(15087581161)联系我(记得备注)。

最新情况:由于笔者最近忙于备考,很多找我问问题的朋友我没能尽力的去帮忙。大家给我的留言我可能不能及时回复,同时很多加我微信好友的,我也不能及时回复。但我还是会抽时间尽力解决大家提出的问题。(2019.06.16)

2019年8月4日  第4次更新

还是有很多同学问我怎么更改每次下载的图片数量,我一开始设置的最高只能下载1060张:

更改方法:把代码中含有1000的地方,全部换成你想要的数字。(例如每类图片都想下载5000张,那么你把1000改成5000)

最近有很多网友留言和加我微信。我都没有回复,原因在于笔者正在备考。明年才有空。2019.11.29

 

2020.4.13更新。

最后在写一下,我代码里面用了t+60是因为,每一页有60张图片,我爬完一页,就代表已经获得60张图片,然后翻页,开始爬取下一页。

另:这个项目是根据网友们的反馈,才得到不断的完善。这已经不再是我一个人的项目了,而是属于各位一起帮忙反馈bug的网友们。非常感谢各位的反馈。

目前笔者仍然没有时间,之前收到一位网友的反馈,一直没有更新。等我5月复试结束以后,我会更新的。

若有网友发现问题,也欢迎继续反馈给我,我后面会找时间更新的。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479805.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文浅尝 | 利用知识图谱嵌入和图卷积网络进行长尾关系抽取

论文笔记整理&#xff1a;王狄烽&#xff0c;南京大学硕士&#xff0c;研究方向为关系抽取、知识库补全。链接&#xff1a;https://arxiv.org/pdf/1903.01306.pdf发表会议&#xff1a;NAACL2019动机现有的利用远程监督进行实体关系抽取的方法大多关注于如何对训练数据进行降噪&…

人脑是怎么防止梯度消失和梯度爆炸的?

文 | 极市平台源 | 知乎问答导读梯度消失和梯度爆炸一直是深度学习的难点&#xff0c;而人脑有接近900亿个神经元&#xff0c;可以说是一个非常规模庞大的网络。那么人脑是如何防止梯度消失和梯度爆炸的&#xff1f;观点一作者丨冒蓝火的加特林感觉这个问题跟我的科研方向有一点…

史上最全java架构师技能图谱(下)

“java架构史上最全技能图谱分为上下两篇&#xff0c;这是java架构史上最全图谱下篇&#xff0c;包含&#xff1a; 大数据以及性能、设计模式、UML、中间件、分布式集群、负载均衡、通讯协议、架构设计等技术图谱等章节。 如果需要上篇内容&#xff1a;数结构算法、java进阶、…

Git基本指令

一、创建本地仓库进行版本控制 在工作区 local_repository 新建readme.txt文件&#xff1a; git init &#xff1a;初始化一个空的本地仓库&#xff0c;并在本地仓库生成了.git 文件git add readme.txt &#xff1a;将文件放到暂存区&#xff0c;表示这个文件受git管理git co…

LeetCode 21. 合并两个有序链表(单链表)

文章目录1. 题目信息2. 解题1. 题目信息 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例&#xff1a;输入&#xff1a;1->2->4, 1->3->4 输出&#xff1a;1->1->2->3->4->4来源&#xff1a…

一文读懂最强中文NLP预训练模型ERNIE

基于飞桨开源的持续学习的语义理解框架ERNIE 2.0&#xff0c;及基于此框架的ERNIE 2.0预训练模型&#xff0c;在共计16个中英文任务上超越了BERT和XLNet, 取得了SOTA效果。本文带你进一步深入了解ERNIE的技术细节。 一&#xff1a;ERNIE 简介 1.1 简介 Google 最近提出的 BER…

BERT原理、代码、相关模型、精调技巧,看这个就够了

星标/置顶小屋&#xff0c;带你解锁最萌最前沿的NLP、搜索与推荐技术2018 年 10 月&#xff0c;由 Google 推出的 BERT 模型一鸣惊人&#xff0c;刷爆了各路榜单&#xff0c;甚至超越了人类基线分数&#xff0c;实现了 NLP 领域里程碑式的突破。 如今&#xff0c;对于 NLP 算法…

论文浅尝 | 利用 KG Embedding 进行问题回答

论文笔记整理&#xff1a;吴杨&#xff0c;浙江大学计算机学院&#xff0c;知识图谱、NLP方向。http://research.baidu.com/Public/uploads/5c1c9a58317b3.pdf动机本文主要针对基于知识库的问题回答中的简单问题&#xff0c;也就是问题的答案只涉及KG中的一跳&#xff0c;此类问…

想成为阿里160万年薪的P8架构师?你必须掌握如下6大技能体系!

程序设计和开发 数据结构和算法&#xff1a;常用数据结构&#xff0c;排序&#xff0c;检索等 面向对象编程、设计模式&#xff0c;掌握建模语言和建模工具&#xff1a;UML、MVC编程思想 高质量编码能力&#xff1a;重用性&#xff0c;低耦合&#xff0c;可扩展性&#xff0c…

技术动态 | 知识图谱的策展

作者&#xff1a;Jiaoyan Chen, Senior Researcher, Department of Computer Science, University of Oxford, Research interests: Knowledge Base, Knowledge-based Learning, Machine Learning Explanation.知识图谱在众多的领域中发挥了重要作用&#xff0c;比如聊天机器人…

21届校招薪资曝光:严重倒挂老员工!

源 | 量子位一开始&#xff0c;还以为是科技互联网公司招聘的新把式。因为就在最近&#xff0c;一张美团应届生薪资的截图&#xff0c;在各大社区和校招群里火了。仅仅算法岗、开发岗的薪资白菜价&#xff0c;就有27k15.5&#xff0c;算下来&#xff0c;年薪就有41万。虽然这两…

从Java程序员进阶到架构师,6大核心技能要领详解

“ java架构师技能将分为如下6大环节&#xff1a;数据结构和算法&#xff0c;Java高级特性&#xff0c;Java web核心&#xff0c;数据库&#xff0c;Java框架与必备工具&#xff0c;系统架构设计。 希望能真正帮助到从程序员进阶到架构师之路的朋友。 数据结构和算法 算法分…

领域应用 | ​英文抗生素药物医学知识图谱 IASO1.0 版发布 线上试用正式启动

本文转载自公众号&#xff1a;PKU自然语言处理前沿。近日&#xff0c;由北京大学互联网信息工程研发中心&#xff08;CIRE&#xff09;开发的英语医学知识图谱英文抗生素药物医学知识图谱IASO1.0发布&#xff0c;面向公众正式开放试用。IASO是利用自然语言处理与文本挖掘技术&a…

谷歌大改Transformer注意力,速度大涨,显存大降!

源 | 机器之心导读考虑到 Transformer 对于机器学习最近一段时间的影响&#xff0c;这样一个研究就显得异常引人注目了。Transformer 有着巨大的内存和算力需求&#xff0c;因为它构造了一个注意力矩阵&#xff0c;需求与输入呈平方关系。谷歌大脑 Krzysztof Choromanski 等人最…

阿里P7架构师要求:Web核心+开源框架+大型网站架构!含面试题目!

阿里P7技能&#xff08;一&#xff09;&#xff1a;数据结构和算法&#xff1a; 常用数据结构&#xff1a;链表、堆与栈、哈希表等&#xff0c;常用的排序等。 掌握&#xff1a;精通 阿里P7技能&#xff08;二&#xff09;&#xff1a;java高级 java相关的高级特性&#xff1…

LeetCode 986. 区间列表的交集

文章目录1. 题目信息2. 解题1. 题目信息 给定两个由一些闭区间组成的列表&#xff0c;每个区间列表都是成对不相交的&#xff0c;并且已经排序。 返回这两个区间列表的交集。 &#xff08;形式上&#xff0c;闭区间 [a, b]&#xff08;其中 a < b&#xff09;表示实数 x …

论文浅尝 | 学习开发知识图谱中的长期关系依赖 - ICML 2019 ​

本文转载自公众号&#xff1a;南大Websoft。 论文&#xff1a;https://arxiv.org/abs/1905.04914代码&#xff1a;https://github.com/nju-websoft/RSN背景知识图谱结构化地存储着大量现实世界中的事实。其中&#xff0c;每个事实都以三元组 (s, r, o) 的方式进行描述&#xf…

一张图看懂小米千亿美金生态链产品

小米上市近在眼前&#xff0c;最快5月初提交IPO申请&#xff0c;再到小米IPO股指不断攀升&#xff0c;估值直奔1000亿美金以上&#xff0c;小米用了7年时间&#xff0c;这在整个互联网的发展史上&#xff0c;也算是火箭般的发展速度。 今天我们一起复盘看看小米的千亿美金生态…

Pycharm使用远程服务器运行代码

pycharm下载专业版&#xff0c;然后用学生邮箱申请个激活码&#xff08;我这里申请了个账号&#xff0c;更方便&#xff09;。 连上厦大VPN&#xff0c;再用pycharm高级版可以直接连到学校的GPU服务器&#xff0c;这样平时不在学校也能调试服务器了。 厦大VPN设置 pycharm下载…