网络爬虫
Posted zhoulixiansen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络爬虫相关的知识,希望对你有一定的参考价值。
在上一节中我们知道了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库。
以上是关于网络爬虫的主要内容,如果未能解决你的问题,请参考以下文章
VSCode自定义代码片段14——Vue的axios网络请求封装
VSCode自定义代码片段14——Vue的axios网络请求封装
VSCode自定义代码片段14——Vue的axios网络请求封装