21天打造分布式爬蟲-urllib庫(一)


 1.1.urlopen函數的用法

#encoding:utf-8

from urllib import request

res = request.urlopen("https://www.cnblogs.com/")

print(res.readlines())


#urlopen的參數
#def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
#            *, cafile=None, capath=None, cadefault=False, context=None):

 1.2.urlretrieve函數

 將網頁上的文件保存到本地

#coding:utf-8

from urllib import request

res = request.urlretrieve("https://www.cnblogs.com/",'cnblog.html')


#urlretrieve參數
#def urlretrieve(url, filename=None, reporthook=None, data=None):

 1.3.參數編碼和解碼函數

 urlencode函數用於編碼中文和特殊字符

#urlencode函數

# 簡單用法
#from urllib import parse
# data = {'name':'德瑞克','age':100}
# qs = parse.urlencode(data)
# print(qs)    #name=%E5%BE%B7%E7%91%9E%E5%85%8B&age=100

#實際用例
from urllib import request,parse
url = "http://www.baidu.com/s"
params = {"wd":"博客園"}
qs = parse.urlencode(params)
url = url + "?" + qs
res = request.urlopen(url)
print(res.read())

parse_qs函數用於將經過編碼后的url參數進行解碼。

from urllib import parse

qs = "name=%E5%BE%B7%E7%91%9E%E5%85%8B&age=100"
print(parse.parse_qs(qs))   #{'name': ['德瑞克'], 'age': ['100']}

 1.4.urlparse和urlsplit函數用法

 urlparse和urlsplit都是用來對url的各個組成部分進行分割的,唯一不同的是urlsplit沒有"params"這個屬性.

from urllib import request,parse

url = "https://www.baidu.com/s?wd=cnblog#2"
result = parse.urlparse(url)
print(result)
#ParseResult(scheme='https', netloc='www.baidu.com', path='/s', params='', query='wd=cnblog', fragment='2')

print('scheme:',result.scheme)   #協議
print('netloc:',result.netloc)   #域名
print('path:',result.path)       #路徑
print('query:',result.query)     #查詢參數

#結果
#scheme: https
# netloc: www.baidu.com
# path: /s
# query: wd=cnblog

 1.5.Request爬去拉勾網職位信息

Request類的參數

class Request:

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

爬去拉鈎網職位信息

拉勾網的職位信息是在Ajax.json里面

 

 代碼:

#利用Request類爬去拉勾網職位信息

from urllib import request,parse

url = "https://www.lagou.com/jobs/positionAjax.json?city=%E5%8C%97%E4%BA%AC&needAddtionalResult=false"

#請求頭
headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36",
    "Referer":"https://www.lagou.com/jobs/list_python?city=%E5%8C%97%E4%BA%AC&cl=false&fromSearch=true&labelWords=&suginput="
}
#post請求需要提交的數據
data = {
    'first':'true',
    'pn':1,
    'kd':'python'
}
#post請求的data數據必須是編碼后的字節類型
req = request.Request(url,headers=headers,data=parse.urlencode(data).encode('utf-8'),method='POST')   #建立一個請求對象
res = request.urlopen(req)
#獲取的信息是字節類型,需要解碼
print(res.read().decode('utf-8'))

1.6.ProxyHandler代理

代理原理:在請求目的網站之前,先請求代理服務器,然后讓代理服務器去請求目的網站,獲取到數據后,再返回給我們。

#代理的使用
from urllib import request

url = "https://www.baidu.com/s?wd=cnblog"

#1.使用ProxyHandler傳入代理構建一個handler
# handler = request.ProxyHandler({'http':'115.210.31.236.55:9000'})
handler = request.ProxyHandler({'http':'115.210.31.236.55:9000'})
#2.使用創建的handler構建一個opener
opener = request.build_opener(handler)
#3.使用opener去發送一個請求
res = opener.open(url)
print(res.read())

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM