Python3爬虫学习笔记1.1——urllib官方库的使用

来源:互联网 发布:pano2vr mac v4.1.0 编辑:程序博客网 时间:2024/05/04 04:07

欢迎捧场,上篇我们对什么是爬虫有一个大概的了解,那么我们可以用爬虫来做什么呢?爬虫又是怎么做到的呢?我们一起学习吧。

1.扒个网页压压惊

作为一个知乎的小白用户,平时的任务基本上就是刷刷问题点点赞什么的,今天我们爬一下知乎,应该不会出什么幺蛾子吧。

import urllib.requestresp=urllib.request.urlopen('http://www.zhihu.com')print(resp.read())

写完了之后运行一下,你就会看见这“三行情书”爬下来的一个知乎首页,三行爬虫。曾经在我找爬虫资料的是看见了不止一个人说自己学习爬虫就是为了“哄妹子”,结果发现,爬虫比妹子好玩。2333,我还是选择妹子。运行结果如下:
知乎首页源码
一不小心知乎首页的源码就显示在你的终端了,就是这么神奇。

2.三行爬虫代码分析

对于第一行,引用的官方库urllib.request,不解释。
第二行代码,我们调用的是urllib.request库里面的urlopen方法(Python3对urllib库做了整合,你有可能看见Python2.X中的写法是 urllib2.urlopen)。对urlopen方法传入一个URL,这个URL就是知乎首页的网址,协议是HTTP协议,代表了一种访问控制协议,urlopen一般接受三个参数,它的参数如下:

urlopen(url, data, timeout)

其中,data 和 timeout 是可选参数。data表示访问URL时要传送的数据,默认为空None;timeout是设置超时时间,默认为 socket._GLOBAL_DEFAULT_TIMEOUT。
url是必须要传送的,在这个例子里面我们传送了知乎首页的URL,执行urlopen方法之后,返回一个resp对象,返回信息便保存在这里面。
第三行:

print(resp.read())

对于返回的resp对象,有一个read()方法,即可获取网页内容并打印出来。尝试一下不用read()方法,直接打印resp对象。

print(resp)

直接打印出了该对象的描述。
直接打印
所以我们在爬网页的过程中切记要加上read()方法,不然你可能就得不到你想要的东西。

3.编码问题

我们在浏览器中打开知乎首页,查看网页源代码,对比看一下。
察看源码
结果如下
对比图片
通过对比,很容易看出来,刚才爬下来的一大串字符,就是知乎的首页代码,但是细心的同学会很容易发现一个问题,就是爬下来的代码中,汉字没有正确表达,原因就是对汉字的编码格式不对。我们现在对爬下来的内容指定编码格式,即:

import urllib.requestresp=urllib.request.urlopen('http://www.zhihu.com')print(resp.read().decode('utf-8'))

将内容用”utf-8“编码表达,然后我们在看一下爬下来的内容。
重新编码之后
可以,很明显,重新编码之后的内容才是我们想要的。

4.构造Requset

上面我们提到了,urlopen一般接受三个参数,

urlopen(url, data, timeout)

data表示访问URL时要传送的数据,即请求报文
我们打开浏览器的开发者工具,查看Request Headers,如下
Request Headers
那我们需要如何构造Requset呢?下面的代码将爬虫伪装为浏览器构造请求报文。

import urllib.requestweb_header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'}url_zhihu='https://www.zhihu.com'req=urllib.request.Request(url=url_zhihu,headers=web_header)resp=urllib.request.urlopen(req)print(resp.read().decode('utf-8'))

这样我们就完成了对爬虫的伪装,服务器会把爬虫当作浏览器。为什么要伪装呢?这是因为很多网站都会有防爬虫机制,如果不做一些必要的伪装,很多网站都爬不下来。
本篇我们一起学习了如果爬取网页内容,以及将爬虫伪装成浏览器,下次我们将学习如何模拟登录和cookie的相关知识,一起努力进步吧。

0 0
原创粉丝点击