爬虫笔记(一)——快速使用urllib库
本人以前用的都是python2.7,但看网上很多教程都是以python3为例的,所以便切换版本,导入urllib、lxml、beautifulsoup4等库。
下面介绍下两个版本对urllib库的区别,方便以前使用python2.7的能很快适应python3版本。在Python2.x中,分为Urllib库和Urllin2库,Python3.x之后都合并到Urllib库中。
- 在Pytho2.x中使用import urllib2——-对应的,在Python3.x中会使用import urllib.request,urllib.error。
- 在Pytho2.x中使用import urllib——-对应的,在Python3.x中会使用import urllib.request,urllib.error,urllib.parse。
- 在Pytho2.x中使用import urlparse——-对应的,在Python3.x中会使用import urllib.parse。
- 在Pytho2.x中使用import urlopen——-对应的,在Python3.x中会使用import urllib.request.urlopen。
- 在Pytho2.x中使用import urlencode——-对应的,在Python3.x中会使用import urllib.parse.urlencode。
- 在Pytho2.x中使用import urllib.quote——-对应的,在Python3.x中会使用import urllib.request.quote。
- 在Pytho2.x中使用cookielib.CookieJar——-对应的,在Python3.x中会使用http.CookieJar。
- 在Pytho2.x中使用urllib2.Request——-对应的,在Python3.x中会使用urllib.request.Request。
快速使用urllib库爬取一个网页
首先需要导入用到的模块:urllib.request。
import urllib.request
导入模块后使用urllib.request.urlopen(url,data = None,[timeout])打开并爬取一个网页,以百度首页为例,并将其赋给一个变量url。其中data是post提交的数据,timeout是设置网站的访问超时时间。
url = urllib.request.urlopen("http://www.baidu.com")
此后我们可以将爬取的网页读取出来,常见的读取方式有以下三种:
- read()读取文件的全部内容,与readlines()不同的是,read()会把读取到的内容赋给一个字符串变量。
- readlines()读取文件的全部内容,readlines()会把读取到的内容赋值给一个列表变量。
- readline()读取文件的一行内容。
data = url.read()
dataline = url.readline()
datalines = url.readlines()
最后将读取的数据写进html格式的文件中并保存,完整代码如下。
import urllib.request
url = urllib.request.urlopen("http://www.baidu.com")
data = url.read()
dataline = url.readline()
datalines = url.readlines()
#print (data)
#print (dataline)
#print (datalines)
fhandle = open('/home/wl/wang.html','wb')
fhandle.write(data)
fhandle.close()
用浏览器打开wang.html文件可得下图:
此时我们已经成功地用程序将百度首页的代码爬取到本地,只不过图片暂时没有爬取下来而已。除了这种方法外,我们还可以使用urllib.request里面的urlretrieve()函数直接将对应信息写入本地文件。
url = urllib.request.urlretrieve("http://www.baidu.com",filename = "/home/wl/1.html")
urlretrieve()函数在执行过程中会产生一些缓存,可以用urlcleanup()进行清除。除此之外,urllib还有一些常见用法,下面一一举例。
1.获取当前爬取网页的状态码
<<<url.getcode()
200
200表示响应正确,404表示失败。
2.获取当前爬取的url地址
<<<url.geturl()
'http://www.baidu.com'
3.一般来说,URL标准中只会允许一部分ASCII字符比如数字、字母、部分符号等,而其他的一些字符,比如汉字、":"、"&"等,是不符合URL标准的。此时,我们需要编码。
>>>urllib.request.quote('http://www.baidu.com')
'http%3A//www.baidu.com'
4.对编码的网址进行解码
>>>urllib.request.unquote('http%3A//www.baidu.com')
'http://www.baidu.com'
5.超时设置
有的时候,我们访问一个网页,如果该网页长时间未响应,那么系统就会判断该网页超时了,即无法打开该网页。 有的时候,我们需要根据自己的需要来设置超时的时间值。我们可以在urllib.request.urlopen()打开网址的时候,通过timeout字段设置。 设置格式为:urllib.request.urlopen(要打开的网址,timeout=时间值)。
6.开启Debuglog
如果像想边运行边打印调试日志,就需要开启Deuglog。
import urllib.request
url = "https://mp.csdn.net/postlist/list/enable"
httphd = urllib.request.HTTPHandler(debuglevel = 1)
httpshd = urllib.request.HTTPSHandler (debuglevel = 1)
opener = urllib.request.build_opener(httphd,httpshd)
opener.addheaders = [('User-Agent','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45')]
urllib.request.install_opener(opener)
data = urllib.request.urlopen(url).read()
print (len(data))