本文由图雀社区成员 灿若星空 写做而成,欢迎加入图雀社区,一块儿创做精彩的免费技术教程,予力编程行业发展。若是您以为咱们写得还不错,记得 点赞 + 关注 + 评论 三连🥰🥰🥰,鼓励咱们写出更好的教程💪css
这是一套基于实战的系列教程,从最简单的爬虫程序开始,授人予渔,详细剖析程序设计的思路,完整展示爬虫是如何一步步调试到最终完成。分享关于爬虫的各类知识、技巧,旨在帮助你们认识爬虫、设计爬虫、使用爬虫最后享受爬虫带给咱们在工做和生活上的各类便利。html
基本的python编程知识前端
提及爬虫每一个人都或多或少的听过与之相关的内容,以为它或高深、或有趣。做为一名写代码四五年的初级码农来看,爬虫程序是计算机程序里面最简单也是最有趣的程序。只要会上网冲浪就有写爬虫程序的天赋。python
爬虫为何是虫呢?由于虫子的头脑比较简单,爬虫程序也是 ++“一根筋”++ ,不须要讳莫如深的数学知识,也不用设计精巧的各种算法。咱们只须要用计算机能听懂的“大白话”平铺直叙就能够啦。算法
一句话总结全部爬虫程序的做用: 模拟人类上网的操做,以此来查找、下载、存储数据。
接下来我要以 男人图这个网站为例,分享套路。编程
此处强烈推荐Chrome
首先打开这个网址:https://www.nanrentu.cc/sgtp/, 会看到如下界面数组
。浏览器
如今咱们只是用浏览器手动打开了这个页面,接下来咱们要用代码,让程序也打开这个页面。这就要分析一下浏览器是如何打开这个页面的了,请看简易流程图。安全
在python中,可使用 requests 这一工具包来发送HTTP请求。为了了解程序所“看到” 页面是什么样子的,咱们须要把程序所获得HTML文件保存到本地,而后再用浏览器打开,就能和程序感同身受了。从而达到“人机合一”的境界。服务器
光说不练假把式,让咱们立刻来新建一个 index.py
文件,而后在其中编写以下内容:
import requests url = "https://www.nanrentu.cc/sgtp/" response = requests.get(url) if response.status_code == 200: with open("result.html",'a',encoding="utf-8") as f: f.write(response.text)
在浏览器打开写入的HTML文件是这样的
这怎么和在浏览器中看到的不同呢?
这个时候我就要亮出一件绝世宝贝————Chrome调试台(按F12)来给您分析一波了。
其实咱们在浏览器中看到的页面并不只仅是HTML页面,而是css、js、html以及各类媒体资源综合在一块儿并有浏览器最终渲染而出页面,红框的部分,标出了在这个过程当中所加载的各个资源。
当咱们用程序去请求服务器时,获得仅仅是HTML页面,因此程序和咱们所看到的页面就截然不同了。不过不要紧HTML是主干,抓住了主干其余的只须要顺藤摸瓜就能够了。
打开这个网址之后,各位小仙女就能够各取所需咯,想体验萧亚轩的快乐嘛?那目标就是小鲜肉;馋彭于晏的那样的身子了?那肌肉帅哥就是你的菜。此外韩国欧巴,欧美型男也是应有尽有。
人类是高级生物,眼睛会自动聚焦的目标身上,可是爬虫是“一根筋”啊,它可不会自动聚焦,咱们还得帮它指引道路。
写过前端页面的朋友都知道CSS样式用过各类选择器来绑定到对应的节点上,那么咱们也能够经过CSS的选择器来选中咱们想要的元素,从而提取信息。Chrome中已经准备了CSS选择器神器,能够生成咱们想要元素的选择器。
具体过程以下:第三步为好好欣赏小哥哥们~
这个时候要介绍页面解析神器pyquery,这个工具库能够经过咱们所复制的CSS选择器,在 HTML 页面中查找对应元素,而且能很便捷地提取各类属性。那么接下来咱们就把这个小哥哥解析出来吧。
咱们首先安装 PyQuery
这个包,具体可使用 pip 包管理器安装,而后将代码修改为以下这样:
import requests from pyquery import PyQuery as pq url = "https://www.nanrentu.cc/sgtp/" response = requests.get(url) if response.status_code == 200: with open("result.html",'w',encoding="utf-8") as f: f.write(response.text) # 开始解析 doc = pq(response.text) # 把复制的选择器粘贴进去 # 选择对应的节点 imgElement = doc('body > div:nth-child(5) > div > div > div:nth-child(2) > ul > li:nth-child(3) > a > img') # 提取属性,获取图片连接 imgSrc = imgElement.attr('src') # 将图片连接输出在屏幕上 print(imgSrc)
这么好看的小哥哥怎么能只让他在互联网上呆着呢?把他放进硬盘里的学习资料文件夹里才是最安全的。接下来,咱们就把小哥哥放到碗里来。
下载图片的过程其实和抓取HTML页面的流程是同样的,也是利用 requests 发送请求从而获取到数据流再保存到本地。
import requests from pyquery import PyQuery as pq url = "https://www.nanrentu.cc/sgtp/" response = requests.get(url) if response.status_code == 200: with open("result.html",'w',encoding="utf-8") as f: f.write(response.text) doc = pq(response.text) imgElement = doc('body > div:nth-child(5) > div > div > div:nth-child(2) > ul > li:nth-child(3) > a > img') imgSrc = imgElement.attr('src') print(imgSrc) # 下载图片 imgResponse = requests.get(imgSrc) if imgResponse.status_code == 200: # 填写文件路径 以二进制的形式写入文件 with open('学习文件/boy.jpg', 'wb') as f: f.write(imgResponse.content) f.close()
此时先来看看效果
至此仅仅十多行代码就完成了一个小爬虫,是否是很简单。其实爬虫的基本思路就这四步,所谓复杂的爬虫就是在这个四步的基础上不断演化而来的。爬虫最终的目的是为了获取各类资源(文本或图片),全部的操做都是以资源为核心的。
经过上述步骤咱们只能获取到一个小哥哥,集美们就说了,我直接右击鼠标下载也能够啊,干吗费劲写爬虫呢?那接下来,咱们就升级一波选择器,把小哥哥们装进数组,通通搞到碗里来。
为了之后写代码更方便,要先进行一个简单的重构,让代码调理清晰。
重构后的代码以下:
import requests from pyquery import PyQuery as pq def saveImage(imgUrl,name): imgResponse = requests.get(imgUrl) fileName = "学习文件/%s.jpg" % name if imgResponse.status_code == 200: with open(fileName, 'wb') as f: f.write(imgResponse.content) f.close() def main(): baseUrl = "https://www.nanrentu.cc/sgtp/" response = requests.get(baseUrl) if response.status_code == 200: with open("result.html",'w',encoding="utf-8") as f: f.write(response.text) doc = pq(response.text) imgElement = doc('body > div:nth-child(5) > div > div > div:nth-child(2) > ul > li:nth-child(3) > a > img') imgSrc = imgElement.attr('src') print(imgSrc) saveImage(imgSrc,'boy') if __name__ == "__main__": main()
有过前端编程经验的同窗们能够看出来,Chrome自动生成的选择器指定了具体的某个子元素,因此就只选中了一个小哥哥,那么接下来咱们要分析出通用的选择器,把臭弟弟们一锅端。
多拿着鼠标点点这个调试台,一层层地看这个HTML文件的元素层级,找到其中相同重复的地方,这就是咱们的突破口所在。
咱们能够看出图片都在一个类名为 h-piclist 的 <ul>
标签中,那么咱们可写出如下的选择器 .h-piclist > li > a > img
。这样就选中了这一页全部的图片元素。接着用一个 for 循环遍历就能够了。
import requests from pyquery import PyQuery as pq # 引入UUID为图片命名 import uuid def saveImage(imgUrl,name): imgResponse = requests.get(imgUrl) fileName = "学习文件/%s.jpg" % name if imgResponse.status_code == 200: with open(fileName, 'wb') as f: f.write(imgResponse.content) f.close() def main(): baseUrl = "https://www.nanrentu.cc/sgtp/" response = requests.get(baseUrl) if response.status_code == 200: with open("result.html",'w',encoding="utf-8") as f: f.write(response.text) doc = pq(response.text) # 选则这一页中全部的目标图片元素 imgElements = doc('.h-piclist > li > a > img').items() # 遍历这些图片元素 for i in imgElements: imgSrc = i.attr('src') print(imgSrc) saveImage(imgSrc,uuid.uuid1().hex) if __name__ == "__main__": main()
能够看出图片的链接已经所有拿到了,可是当去下载图片时却发生了一些意外,请求图片居然没有反应。这是哪里出了问题呢?图片链接所有拿到,证实代码没毛病,把图片连接放到浏览器里正常打开,证实链接没毛病,那如今可能就是网络有毛病了。
这时候因素不少,咱们首先用最简单的方法来解决问题,断线重连。把笔记本WIFI重启,从新加入网络,再运行程序。
惊喜来了,臭弟弟们成功入库。
固然啦,这种方式并非银弹,咱们须要有更多的技巧来提高爬虫程序的“演技”,咱们的爬虫程序表现的越像我的,那咱们获取资源的成功率就会越高。
看到这里,应该跨进爬虫世界的大门了,若是这个世界有主题曲的话那么必定是薛之谦的《演员》接下来的教程中会一遍磨砺“演技”,一遍获取更多的小哥哥。
若是您以为咱们写得还不错,记得 点赞 + 关注 + 评论 三连🥰🥰🥰,鼓励咱们写出更好的教程💪想要学习更多精彩的实战技术教程?来图雀社区逛逛吧。