网络爬虫(三)

在上一节中我们知道了URLopen()可以实现最基本的爬虫请求:

但是几个参数根本不足以构建完整的请求。假如需要在请求中假如Header等信息,就可以尝试利用更加强大的Request类来进行构建。

下面的例子是一个用法:

# -*- coding:UTF-8 -*-
__autor__ = 'zhouli'
__date__ = '2018/6/17 12:02'
import urllib.request
request = urllib.request.Request('https://python.org')
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))

这一次我们依旧是用urlopen来发送请求,但是不同的是,我们请求的不是url了,而是一个request对象,,来看下Request的源码吧

class Request:

    def __init__(self, url, data=None, headers={},
                 origin_req_host=None, unverifiable=False,
                 method=None):

第一个参数是url:必传参数,其他的都是可选参数。

第二个参数data:如果需要传参就必须是传bytes(字节流)类型的。如果他是字典,可以先用urllib.parse模块的urlencode()编码。

data = bytes(urllib.parse.urlencode({'word': 'hello'}), encoding='utf-8')  # parse是用来处理URL,比如拆分和解析、合并等

第三个参数:Headers是一个字典,他就是传说中的请求头,可以再构造请求的时候通过headers参数直接构造,当然也可以通过请求实例的add_header()方法添加。

添加请求头最常见的用法就是修改user-Agent来伪装浏览器,默认的User-Agent是python-urllib,我们可以通过修改它来伪装成浏览器,假设伪装为火狐:

Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11

第四个参数:是用来指定host名称和IP地址。

第五个参数:unverifiable来表示这个请求是否是无法验证的,默认为false,意思就是用户没有足够的权限来选择接受这个请求的结果。例如,我们请求一个HTML的文档中的图片,但是我们没有自动抓取图像的权限。,那么这时unverifiable的值为true。

第六个参数:method就是一个字符串,用来请求使用的方法,就是GET,POST,PUT等

下面传入多个参数的例子:

from urllib import request, parse
url = 'http://www.dyy88.com/post'
headers = {
    'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
    'Host': 'http://www.dyy88.com'
}
dict = {
    'name': 'Germey'
}
data = bytes(parse.urlencode(dict), encoding='utf-8')
req = request.Request(url=url, data=data, headers=headers, method='POST')
response = request.urlopen(req)
print(response.read().decode('utf-8'))

网址是我瞎编的,大家随意换一下即可试一下

 解析链接:urlparse()

from urllib.parse import urlparse
result = urlparse('http://www.baidu.com/index.html;user?id=5#comment')
print(type(result), result)

结果如下:

<class 'urllib.parse.ParseResult'> ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5', fragment='comment')

可以看到,返回的是一种ParseResult类型的对象,它包含6个部分,分别是scheme, netloc,path,params,query,和fragment。

其实这个方法是将url分为6个部分,://前面的就是scheme代表协议,第一个/前面的就是netioc,就是域名,后面是path,后面是parms代表参数,问号?之后的是查询条件query,一般作用于GET类型的URL,井号#后面是锚点,用于定位页面内部的下拉位置。

scheme://netloc/path;params?query#fragment这个就是一个标准的连接格式。

反之有urlunparse()

from urllib.parse import urlunparse
data = ['http', 'www.baidu.com', '/index.html', 'user', 'id=5', 'comment']
result = urlunparse(data)
print(type(result), result)

需要注意的是,data的数据长度必须是6,否则会报错。

好了了解就此停止吧。下一节介绍requests库。

没有过不去的坎,只有没加够的油!
原文地址:https://www.cnblogs.com/zhoulixiansen/p/9218498.html