调用别人网站的数据库,涉县移动网站建设公司,wordpress 文章评价插件,网站设计名称原文地址#xff1a;https://blog.csdn.net/qq_40774175/article/details/81273198 很久之前就学习了Python的爬虫了#xff0c;也用来做过一些项目#xff08;主要是一些课程项目#xff09;#xff0c;但时间比较紧#xff0c;一直没有空把它写下来#xff0c;这个暑假…原文地址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张图片。这也是为啥后面我写代码用了t60。
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 源代码
import reimport requestsfrom urllib import errorfrom bs4 import BeautifulSoupimport os num 0numPicture 0file List [] def Find(url): global Listprint(正在检测图片总数请稍等.....)t 0i 1s 0 while t 1000:Url url str(t) try:Result requests.get(Url, timeout7) except BaseException:t t 60 continue else:result Result.textpic_url re.findall(objURL:(.*?),, result, re.S) # 先利用正则表达式找到图片urls len(pic_url) if len(pic_url) 0: break else:List.append(pic_url)t t 60 return s def recommend(url):Re [] try:html requests.get(url) except error.HTTPError as e: return else:html.encoding utf-8bsObj BeautifulSoup(html.text, html.parser)div bsObj.find(div, idtopRS) if div is not None:listA div.findAll(a) for i in listA: if i is not None:Re.append(i.get_text()) return Re def dowmloadPicture(html, keyword): global num # t 0pic_url re.findall(objURL:(.*?),, html, re.S) # 先利用正则表达式找到图片urlprint(找到关键词: keyword 的图片即将开始下载图片...) for each in pic_url:print(正在下载第 str(num 1) 张图片图片地址: str(each)) try: if each is not None:pic requests.get(each, timeout7) else: continue except BaseException:print(错误当前图片无法下载) continue else:string file r\\ keyword _ str(num) .jpgfp open(string, wb)fp.write(pic.content)fp.close()num 1 if num numPicture: return if __name__ __main__: # 主函数入口word input(请输入搜索关键词(可以是人名地名等): ) #add http://image.baidu.com/search/flip?tnbaiduimageieutf-8word%E5%BC%A0%E5%A4%A9%E7%88%B1pn120url http://image.baidu.com/search/flip?tnbaiduimageieutf-8word word pntot Find(url)Recommend recommend(url) # 记录相关推荐print(经过检测%s类图片共有%d张 % (word, tot))numPicture int(input(请输入想要下载的图片数量 ))file input(请建立一个存储图片的文件夹输入文件夹名称即可)y os.path.exists(file) if y 1:print(该文件已存在请重新输入)file input(请建立一个存储图片的文件夹)输入文件夹名称即可)os.mkdir(file) else:os.mkdir(file)t 0tmp url while t numPicture: try:url tmp str(t)result requests.get(url, timeout10)print(url) except error.HTTPError as e:print(网络错误请调整网络后重试)t t60 else:dowmloadPicture(result.text, word)t t 60 print(当前搜索结束感谢使用)print(猜你喜欢) for re in Recommend:print(re, end )
好了就先写这么多。欢迎大家转载。如有问题欢迎给我留言。 2019年4月2日 第3次更新
这次有网友想要爬取大量的图片作为训练材料。他想要300种不同的图片每种100张如果还是按之前的代码去运行就需要他输入300次图片的名称这样是非常浪费时间的。所以这里对代码进行一些改进你只需要把你想要爬取图片的名称编辑到一个txt文件然后输入你需要的数量就行。 使用方法
首先将你需要下载的图片名称写到一个txt文本上文本的名字叫name即可。
按行输入每行放一个名字。
将name.txt放入和你当前python文件同一目录下即可。 代码
import reimport requestsfrom urllib import errorfrom bs4 import BeautifulSoupimport os num 0numPicture 0file List [] def Find(url): global Listprint(正在检测图片总数请稍等.....)t 0i 1s 0 while t 1000:Url url str(t) try:Result requests.get(Url, timeout7) except BaseException:t t 60 continue else:result Result.textpic_url re.findall(objURL:(.*?),, result, re.S) # 先利用正则表达式找到图片urls len(pic_url) if len(pic_url) 0: break else:List.append(pic_url)t t 60 return s def recommend(url):Re [] try:html requests.get(url) except error.HTTPError as e: return else:html.encoding utf-8bsObj BeautifulSoup(html.text, html.parser)div bsObj.find(div, idtopRS) if div is not None:listA div.findAll(a) for i in listA: if i is not None:Re.append(i.get_text()) return Re def dowmloadPicture(html, keyword): global num # t 0pic_url re.findall(objURL:(.*?),, html, re.S) # 先利用正则表达式找到图片urlprint(找到关键词: keyword 的图片即将开始下载图片...) for each in pic_url:print(正在下载第 str(num 1) 张图片图片地址: str(each)) try: if each is not None:pic requests.get(each, timeout7) else: continue except BaseException:print(错误当前图片无法下载) continue else:string file r\\ keyword _ str(num) .jpgfp open(string, wb)fp.write(pic.content)fp.close()num 1 if num numPicture: return if __name__ __main__: # 主函数入口tm int(input(请输入每类图片的下载数量 ))numPicture tmline_list [] with open(./name.txt, encodingutf-8) as file:line_list [k.strip() for k in file.readlines()] # 用 strip()移除末尾的空格 for word in line_list:url http://image.baidu.com/search/flip?tnbaiduimageieutf-8word word pntot Find(url)Recommend recommend(url) # 记录相关推荐print(经过检测%s类图片共有%d张 % (word, tot))file word 文件y os.path.exists(file) if y 1:print(该文件已存在请重新输入)file word文件夹2os.mkdir(file) else:os.mkdir(file)t 0tmp url while t numPicture: try:url tmp str(t)result requests.get(url, timeout10)print(url) except error.HTTPError as e:print(网络错误请调整网络后重试)t t 60 else:dowmloadPicture(result.text, word)t t 60numPicture numPicture tm print(当前搜索结束感谢使用) 如遇到bug或者有新的需求可以给我留言或者微信(15087581161)联系我(记得备注)。
最新情况由于笔者最近忙于备考很多找我问问题的朋友我没能尽力的去帮忙。大家给我的留言我可能不能及时回复同时很多加我微信好友的我也不能及时回复。但我还是会抽时间尽力解决大家提出的问题。2019.06.16
2019年8月4日 第4次更新
还是有很多同学问我怎么更改每次下载的图片数量我一开始设置的最高只能下载1060张
更改方法把代码中含有1000的地方全部换成你想要的数字。例如每类图片都想下载5000张那么你把1000改成5000
最近有很多网友留言和加我微信。我都没有回复原因在于笔者正在备考。明年才有空。2019.11.29 2020.4.13更新。
最后在写一下我代码里面用了t60是因为每一页有60张图片我爬完一页就代表已经获得60张图片然后翻页开始爬取下一页。
另这个项目是根据网友们的反馈才得到不断的完善。这已经不再是我一个人的项目了而是属于各位一起帮忙反馈bug的网友们。非常感谢各位的反馈。
目前笔者仍然没有时间之前收到一位网友的反馈一直没有更新。等我5月复试结束以后我会更新的。
若有网友发现问题也欢迎继续反馈给我我后面会找时间更新的。