urllib初步

urllib初步

urllib基础

  • urllib.request.urlretrieve(url, filename=):将网页整体爬下来保存到文件里
  • urllib.request.urlcleanup():清除使用urlretrieve时产生的缓存。
  • file.info():输出使用urlopen获取的网页的信息
  • file.getcode():输出使用urlopen获取的网页的状态码,如果状态码为200则表示获取网页正常,403表示禁止访问
  • file.geturl():输出使用urlopen获取网页的网址

超时设置

爬取网页的时候,如果该网页长时间未响应,那么我们判断网页超时,无法打开该网页。有时候我们需要根据自己需要来设置超时的时间值,在urlopen函数中增加timeout的参数。例如我们读取google主页:

1
2
3
import urllib.request
data = urllib.request.urlopen('https://www.baidu.com', timeout = 1)
# 这里就设置了时间为1秒超时

自动模拟HTTP请求

客户端如果要与服务器进行通信,需要通过http请求来进行,http请求有很多种,这里主要记录post与get两种请求方式。比如登陆,搜索某些信息的时候会用到。

get请求

我们在google搜索某些关键字的时候,可以观察他的url。例如我们可以搜索python得到了google的url为:http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=python&oq=python&rsv_pq=9d99064b0016bf5e&rsv_t=9fe5q9eBEtUDaJbaxxhdUQFH4bZL9%2FgLSsjWzOpEyrqzei%2FJ6ekK%2FFPFr1g&rqlang=cn&rsv_enter=0&rsv_sug3=3&rsv_dl=tb&rsv_sug4=1591在这里我们可以看到网页url中有?开头的字段,其对应的就是get请求的字段wd=python,其中wd为字段名,python为字段值。字段与字段之间用&隔开。我们只会利用到其中的一些字段,通过一些实验之后我们可以发现关键字段为ie以及wd这两个字段(如果没有包含所有关键字段的话,返回的网页不是403forbidden就是该网页不存在,总之不正常),将非关键字段去除之后,我们可能会得到剩下的url为:http://www.baidu.com/s?ie=utf-8&wd=python。如果要进行网页爬取的话,应用这种比较简单的格式就可以。

将网址作为一个请求来发送的话,可参见下面的代码

1
2
3
4
5
6
7
8
9
10
import urllib.request

keyword = 'python'
keyword2= urllib.request.quote('蟒蛇')
url = 'http://www.baidu.com/s?ie=utf-8&wd=' + keyword
req = urllib.request.Request(url)
data = urllib.request.urlopen(req).read()
fp = open('request.html', 'wb')
fp.write(data)
fp.close()

注意如果在请求中包含中文的时候会出现编码问题,需要使用urllib.request.quote('中文字符')来先对关键词进行编码,然后再进行爬取。

post请求

测试用网页:https://www.iqianyue.com/mypost/

post请求一般会在网站登录的时候使用到,下面我们来看一个例子,我们进入新浪的登录页面:https://login.sina.com.cn/signup/signin.php,查看此网页的源代码:

1
2
3
4
5
6
7
8
<form method="post" id="vForm" name="vForm">
... ...
<span class="tit">登录名:</span>
<input type="hidden" id="ag" name="ag" value="">
<input autocomplete="off" id="username" name="username" tabindex="0" type="text" value="" maxlength="64" class="fInput w200" alt="登录名:无内容/长度{1-64}/errArea{usernameErr}" placeholder="微博/邮箱/博客帐号"/>
... ...
<span class="tit">密码:</span>
<input id="password" name="password" type="password" tabindex="1" maxlength="32" alt="密码:无内容/errArea{passwordErr}" class="fInput w200" value="" />

找到这个页面中methodpost的表单(form),检查其中的登录名与密码段落,关注其中的name字段,这里我们可以看到登录名的name属性为username而密码的name属性为password

下面我们使用测试网页来进行测试,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import urllib.request
import urllib.parse

url = 'https://www.iqianyue.com/mypost/'
# 这里需要使用parse包中的urlencode来对字段进行编码
login_info = urllib.parse.urlencode({
'name':'myusername',
'pass':'mypassword'
}).encode('utf-8')
# 封装为请求
req = urllib.request.Request(url, login_info)
data = urllib.request.urlopen(req).read()
fp = open('post_req.html', 'wb')
fp.write(data)
fp.close()