码迷,mamicode.com
首页 > 其他好文 > 详细

网络爬虫(三)

时间:2018-06-24 18:01:41      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:权限   需要   用法   add   code   path   解析   网络爬虫   head   

在上一节中我们知道了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库。

 

网络爬虫(三)

标签:权限   需要   用法   add   code   path   解析   网络爬虫   head   

原文地址:https://www.cnblogs.com/zhoulixiansen/p/9218498.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!