网络爬虫,又称为网页蜘蛛(WebSpider),非常形象的一个名字。如果你把整个互联网想象成类似于蜘蛛网一样的构造,那么我们这只爬虫,就是要在上边爬来爬去,顺便获得我们需要的资源。我们之所以能够通过百度或谷歌这样的搜索引擎检索到你的网页,靠的就是他们大量的爬虫每天在互联网上爬来爬去,对网页中的每个关键词进行索引,建立索引数据库。在经过复杂的算法进行排序后,这些结果将按照与搜索关键词的相关度高低,依次排列。
urllib模块实际上是综合了url和lib的一个包。
url的一般格式为:
URL 由三部分组成:
第三部分是资源的具体地址,如目录或者文件名等
举一个例子说明:
当遇到不了解的模块时,可通过IDLE中Help中打开Python的文档进行搜索查看,也可以使用print(模块名.__doc__)或者help(模块名)进行属性和使用方法的查看。如下为文档中urlopen的用法:
实例1:在placekitten网站下载一只猫的图片
可看到在当前运行目录下已成功下载了图片。
urlopen的url参数既可以是字符串也可以是一个request对象,则我们还可以将代码写成如下形式:
实例2:利用百度翻译进行翻译
小甲鱼的视频中的实例是有道翻译,运行结果如下:
看弹幕说是有道翻译加了反爬虫机制,所以自己用百度翻译做了一个,研究了好一会儿,新手还是懵懵懂懂的,不过做出来了还是很开心的。代码如下所示:
打开翻译首页,点击翻译,在Network中找打方法为post的项,各个浏览器可能有差异,可尝试在Network里的XHR中查找。
代码中的url和data是复值表头中的url和Form Data,在IE浏览器中我找了好久,下面分别为360浏览器和IE浏览器的截图:
360:
IE:
接着我们解释此行代码:
代码中使用了josen模块,因为直接打印出html出来的是json格式的数据不利于直接观看。最终运行结果如下所示:
两种方法隐藏(修改)headers:
(1)通过Request的headers参数修改
文档中说到headers必须是字典的形式,所以方法(1)直接通过增加字典键和对应值的方式来进行隐藏,如下所示,找到Request Headers中的User-Agent对应的值进行添加。
运行结果及headers是否正确输入的检查:
第二种方法:
第四种方法是引入代理,代理把看到的内容返回给你,所以可以达到同样的效果。使用代理的步骤如下:
1. 参数是一个字典 {‘类型’:‘代理ip:端口号’}
2. 定制、创建一个 opener
3b. 调用 opener
运行结果如下所示,返回的IP地址是你的代理IP地址。
跟着小甲鱼的视频去煎蛋网抓取妹子图啦,下述内容将自动进行和谐咔咔咔...
思路:新建本地保存图片文件夹→打开网站→记住图片的地址→保存图片到相应的文件夹
如图为煎蛋网妹子图网页显示,图片是按照页码来放置的。
我们发现点击不同的页码,url改变的只是页码处的数字。
首先我们要获取页码,在页码处右键点击审查元素,如下所示:
则我们可以读取到网页的html,然后使用find函数来找到[190]中的数字190,也就是当前页码。
接着我们要获取当前页码下每张图片的url,同样在图片点击右键选择审查元素,可看到图片的地址如下:
嘻嘻,是gakki。以上是准备工作,接着我们就可以写出大概的框架来,其余的内容由函数封装实现
完整实现代码如下所示:
成功在本地新建的文件夹中获取到了jpg的图片。
(1)URLError
当urlopen无法处理一个响应的时候,就会引发URLError异常。 通常,没有网络连接或者对方服务器压根儿不存在的情况下,就会引发这个异常。同时,这个URLError会伴随一个reason属性,用于包含一个由错误编码和错误信息组成的元组。
(2)HTTPError
HTTPError是URLError的子类,服务器上每一个HTTP的响应都包含一个数字的“状态码”。有时候状态码会指出服务器无法完成的请求类型,一般情况下Python会帮你处理一部分这类响应(例如,响应的是一个“重定向”,要求客户端从别的地址来获取文档,那么urllib会自动为你处理这个响应。);但是呢,有一些无法处理的,就会抛出HTTPError异常。这些异常包括典型的:404(页面无法找到),403(请求禁止)和401(验证请求)。