Python 爬虫 ---- urllib 库

urllib 常用函数

一、request/parse函数

from urllib import request
from urllib import parse
1 urlopen函数:
	1.1 各参数
	url:请求的url。
	data:请求的data,如果设置了这个值,那么将变成post请求。
	返回值:返回值是一个http.client.HTTPResponse对象,这个对象是一个类文件句柄对象。有read(size)、readline、readlines以及getcode等方法。
	1.2 代码:
	resp = request.urlopen('http://www.baidu.com')
	print(resp.read())
2. urlretrieve函数:
	2.1 说明:这个函数可以方便的将网页上的一个文件保存到本地。以下代码可以非常方便的将百度的首页下载到本地:
	2.2 代码:
	from urllib import request
	request.urlretrieve('http://www.baidu.com/','baidu.html')
3. urlencode函数:
	3.1 说明:urlencode可以把字典数据转换为URL编码的数据
	3.2 代码
	from urllib import parse
	data = {'name':'爬虫基础','greet':'hello world','age':100}
	qs = parse.urlencode(data)
	print(qs)
4. parse_qs函数:
	4.1 说明:可以将经过编码后的url参数进行解码
	4.2 代码:
	qs = "name=%E7%88%AC%E8%99%AB%E5%9F%BA%E7%A1%80&greet=hello+world&age=100"
	print(parse.parse_qs(qs))
5. urlparse和urlsplit:
	5.1 说明:对url中的各个组成部分进行分割
	5.2 代码:
	url = 'http://www.baidu.com/s?username=zhiliao'
	result = parse.urlsplit(url)
	# result = parse.urlparse(url)
	print('scheme:',result.scheme)
	print('netloc:',result.netloc)
	print('path:',result.path)
	print('query:',result.query)
	5.3 urlparse和urlsplit对比
	urlparse和urlsplit基本上是一模一样的。唯一不一样的地方是,urlparse里面多了一个params属性,
	而urlsplit没有这个params属性。比如有一个url为:url = 'http://www.baidu.com/s;hello?wd=python&username=abc#1',
	那么urlparse可以获取到hello,而urlsplit不可以获取到。url中的params也用得比较少。
6. request.Request类:
	6.1 说明:在请求的时候增加一些请求头
	6.2 代码:
	headers = {
	'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'
	}
	req = request.Request("http://www.baidu.com/",headers=headers)
	resp = request.urlopen(req)
	print(resp.read())

二、ProxyHandler处理器(代理设置)

1. 没有使用代理
resp = request.urlopen('http://httpbin.org/get')
print(resp.read().decode("utf-8"))

2. 使用代理
handler = request.ProxyHandler({"http":"218.66.161.88:31769"})
opener = request.build_opener(handler)
req = request.Request("http://httpbin.org/ip")
resp = opener.open(req)
print(resp.read())

3. 常用的代理有:
西刺免费代理IP:http://www.xicidaili.com/
快代理:http://www.kuaidaili.com/
代理云:http://www.dailiyun.com/

三、Cookie

1. cookie的格式:
	Set-Cookie: NAME=VALUE;Expires/Max-age=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE
	参数意义:
	NAME:cookie的名字。
	VALUE:cookie的值。
	Expires:cookie的过期时间。
	Path:cookie作用的路径。
	Domain:cookie作用的域名。
	SECURE:是否只在https协议下起作用。
2. 使用cookielib库和HTTPCookieProcessor模拟登录:
	2.1 方法一:将Cookie从浏览器复制出来放在header中
	from urllib import request
	headers = {
	    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36',
	    'Cookie': 'anonymid=jacdwz2x-8bjldx; depovince=GW; _r01_=1; _ga=GA1.2.1455063316.1511436360; _gid=GA1.2.862627163.1511436360; wp=1; JSESSIONID=abczwY8ecd4xz8RJcyP-v; jebecookies=d4497791-9d41-4269-9e2b-3858d4989785|||||; ick_login=884e75d4-f361-4cff-94bb-81fe6c42b220; _de=EA5778F44555C091303554EBBEB4676C696BF75400CE19CC; p=61a3c7d0d4b2d1e991095353f83fa2141; first_login_flag=1; [email protected]; ln_hurl=http://hdn.xnimg.cn/photos/hdn121/20170428/1700/main_nhiB_aebd0000854a1986.jpg; t=3dd84a3117737e819dd2c32f1cdb91d01; societyguester=3dd84a3117737e819dd2c32f1cdb91d01; id=443362311; xnsid=169efdc0; loginfrom=syshome; ch_id=10016; jebe_key=9c062f5a-4335-4a91-bf7a-970f8b86a64e%7Ca022c303305d1b2ab6b5089643e4b5de%7C1511449232839%7C1; wp_fold=0'
	}
	url = 'http://www.renren.com/880151247/profile'
	req = request.Request(url,headers=headers)
	resp = request.urlopen(req)
	with open('renren.html','w') as fp:
	    fp.write(resp.read().decode('utf-8'))
	
	2.2 方法二:利用http.cookiejar和request.HTTPCookieProcessor
	from urllib import request,parse
	from http.cookiejar import CookieJar

	headers = {
	    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'
	}
	#建立通道
	def get_opener():
	    cookiejar = CookieJar()
	    handler = request.HTTPCookieProcessor(cookiejar)
	    opener = request.build_opener(handler)
	    return opener
	#发送请求
	def login_renren(opener):
	    data = {"email": "[email protected]", "password": "pythonspider"}
	    data = parse.urlencode(data).encode('utf-8')
	    login_url = "http://www.renren.com/PLogin.do"
	    req = request.Request(login_url, headers=headers, data=data)
	    opener.open(req)
	#获取相应
	def visit_profile(opener):
	    url = 'http://www.renren.com/880151247/profile'
	    req = request.Request(url,headers=headers)
	    resp = opener.open(req)
	    with open('renren.html','w') as fp:
	        fp.write(resp.read().decode("utf-8"))

	if __name__ == '__main__':
	    opener = get_opener()
	    login_renren(opener)
	    visit_profile(opener)
3. 保存cookie到本地:使用cookiejar的save方法,需要指定一个文件名:
	from urllib import request
	from http.cookiejar import MozillaCookieJar

	cookiejar = MozillaCookieJar("cookie.txt")
	handler = request.HTTPCookieProcessor(cookiejar)
	opener = request.build_opener(handler)

	headers = {
	    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'
	}
	req = request.Request('http://httpbin.org/cookies',headers=headers)

	resp = opener.open(req)
	print(resp.read())
	cookiejar.save(ignore_discard=True,ignore_expires=True)
4. 从本地加载cookie:需要使用cookiejar的load方法,需要指定方法:
	from urllib import request
	from http.cookiejar import MozillaCookieJar

	cookiejar = MozillaCookieJar("cookie.txt")
	cookiejar.load(ignore_expires=True,ignore_discard=True)
	handler = request.HTTPCookieProcessor(cookiejar)
	opener = request.build_opener(handler)

	headers = {
	    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'
	}
	req = request.Request('http://httpbin.org/cookies',headers=headers)

	resp = opener.open(req)
	print(resp.read())

‘’

猜你喜欢

转载自blog.csdn.net/weixin_42902669/article/details/84259036