日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python网络爬虫系列(一)——urllib库(urlopen、urlretrieve、urlencode、parse-qs、urlparse和urlsplit、request.Request类)

發(fā)布時間:2024/7/5 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python网络爬虫系列(一)——urllib库(urlopen、urlretrieve、urlencode、parse-qs、urlparse和urlsplit、request.Request类) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

urllib庫

urllib庫是Python中一個最基本的網(wǎng)絡請求庫。可以模擬瀏覽器的行為,向指定的服務器發(fā)送一個請求,并可以保存服務器返回的數(shù)據(jù)。

一、urlopen函數(shù):

在Python3的urllib庫中,所有和網(wǎng)絡請求相關(guān)的方法,都被集到urllib.request模塊下面了,以先來看下urlopen函數(shù)基本的使用:

from urllib import parse,requestresp=request.urlopen('http://www.baidu.com') print(resp.read())

實際上,使用瀏覽器訪問百度,右鍵查看源代碼。你會發(fā)現(xiàn),跟我們剛才打印出來的數(shù)據(jù)是一模一樣的。也就是說,上面的三行代碼就已經(jīng)幫我們把百度的首頁的全部代碼爬下來了。一個基本的ur請求對應的python代碼真的非常簡單。
以下對urlopen函數(shù)的進行詳細講解:

  • ur1:請求的url。
  • data:請求的data,如果設置了這個值,那么將變成post請求。
  • 返回值:返回值是一個http.client.HTTPResponse對象,這個對象是一個類文件句柄對象。有read(size)、readline、readlines以及 getcode等方法。
  • 二、urlretrieve函數(shù):

    這個函數(shù)可以方便的將網(wǎng)頁上的一個文件保存到本地。以下代碼可以非常方便的將百度的首頁下載到本地:

    request.urlretrieve("http://www.baidu.com/""baidu.html"

    三、urlencode函數(shù):

    用瀏覽器發(fā)送請求的時候,如果url中包含了中文或者其他特殊字符,那么瀏覽器會自動的給我們進行編碼。而如果使用代碼發(fā)送請求,那么就必須手動的進行編碼,這時候就應該使用urlencode函數(shù)來實現(xiàn)。urlencode 可以把字典數(shù)據(jù)轉(zhuǎn)換為URL編碼的數(shù)據(jù)。
    示例代碼如下:

    from urllib import parse data={'name':'爬蟲基礎','greet':'hel1o world','age':100} qs=parse.urlencode(data) print(qs)

    四、parse-qs函數(shù):

    可以將經(jīng)過編碼后的url參數(shù)進行解碼.示例代碼如下:

    from urllib import parse qs="name=%E7%88%AC%E8%99%AB%E5%9F%BA%E7%A1%80&greet=hel1o+world&age=100" print(parse.parse_qs(qs))

    五、urlparse和urlsplit:

    有時候拿到一個url想要對這個url中的各個組成部分進行分割,那么這時候就可以使用urlparse 或者是urlsplit來進行分割。

    urlparse VS urlsplit:
    urlparse和urlsplit基本上是一模一樣的。唯一不一樣的地方是,'urlparse里面多了一個params屬性,而urlsplit 沒有這個params 屬性。
    比如有一個ur1為:url=“http://www.baidu.com/s;he116wd=python&username=abc#1”,那么urlparse可以獲取到hello,而urlsplit不可以獲取到ur1中的params。不過params也用得比較少。

    示例代碼如下:

    from urllib import parse# urlparse()函數(shù),可以對url中的各個組成部分進行分割 url = 'http://www.baid.com/s;hello?wd=python&username=abc#1' result = parse.urlparse(url) print(result) print('sheme:',result.scheme) print('netloc:',result.netloc) print('path:',result.path) print('params:',result.params) print('query:',result.query) print('fragment:',result.fragment) print("___________________________________________________")# urlsplit()函數(shù),可以對url中的各個組成部分進行分割。 # 與urlparse()函數(shù)的區(qū)別是獲取不到params參數(shù) url = 'http://www.baid.com/s;hello?wd=python&username=abc#1' result1 = parse.urlsplit(url) print(result1) print('sheme:',result1.scheme) print('netloc:',result1.netloc) print('path:',result1.path) print('query:',result1.query) print('fragment:',result1.fragment)

    六、request.Request類:

    如果想要在請求的時候增加一些請求頭,那么就必須使用request.Request類來實現(xiàn)。比如要增加一個user-Agent,示例代碼如下:

    from urllib import request,parse# url = 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput='# resp = request.urlopen(url) # print(resp.read())url='https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false' headers = {'User-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36','Referer': 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=','cookie':'JSESSIONID=ABAAAECABFAACEA3AD765CDE843CA586D421446C532914E; WEBTJ-ID=20200705115323-1731d1b6bc825-0405fa83b8e6d6-4353760-1327104-1731d1b6bc9384; RECOMMEND_TIP=true; _ga=GA1.2.46425096.1593921203; _gid=GA1.2.826525276.1593921203; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1593921203; user_trace_token=20200705115324-c8c6fa59-8a84-4396-8006-b333350a1ba3; LGUID=20200705115324-4e60a88a-117c-41b1-9f9a-4fab6e3de16c; index_location_city=%E5%85%A8%E5%9B%BD; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%221731d1bd5ef189-0fcf11ef369d0e-4353760-1327104-1731d1bd5f053e%22%2C%22%24device_id%22%3A%221731d1bd5ef189-0fcf11ef369d0e-4353760-1327104-1731d1bd5f053e%22%7D; sajssdk_2015_cross_new_user=1; gate_login_token=026296b5405ba7262db2b24fcf9d5b8117c81a1e33622a5e79041639173d1a81; LG_HAS_LOGIN=1; _putrc=FC2FE27B6F83DDA8123F89F2B170EADC; login=true; hasDeliver=0; privacyPolicyPopup=false; TG-TRACK-CODE=search_code; X_HTTP_TOKEN=fce9ae0065ee91cf1966393951d8f9e3438bdf9565; _gat=1; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1593936691; unick=%E7%94%A8%E6%88%B77635; showExpriedIndex=1; showExpriedCompanyHome=1; showExpriedMyPublish=1; PRE_UTM=; PRE_HOST=; PRE_LAND=https%3A%2F%2Fwww.lagou.com%2Fjobs%2Flist%5Fpython%3FlabelWords%3D%26fromSearch%3Dtrue%26suginput%3D; PRE_SITE=https%3A%2F%2Fwww.lagou.com%2F; LGSID=20200705161131-ef5a3ae0-624a-4e8d-a2ab-f1a137a0b949; SEARCH_ID=af2f4215dc1c4b94b740856f91881da2; LGRID=20200705161132-15702da1-6480-4fa5-8e16-72c5a2c0ed45' }data = {'first':'true','pn':1,'kd':'python' }req = request.Request(url,headers=headers,data=parse.urlencode(data).encode('utf-8'),method='POST') resp = request.urlopen(req) print(resp.read().decode('utf-8')) # print(resp.read())


    JSON在線解析網(wǎng)站:http://json.cn/
    自動獲取本地IP地址網(wǎng)站:http://httpbin.org/

    七、代碼:

    from urllib import request from urllib import parse# resp = request.urlopen('http://www.baidu.com') # print(resp.read()) # print(resp.read(10)) # print(resp.readline()) # print(resp.readlines()) # print(resp.getcode())# urlretrieve函數(shù),可以將網(wǎng)頁上的一個文件保存到本地 # request.urlretrieve("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1593927965278&di=8749753c6b8d8d142eb37ebac38fe7de&imgtype=0&src=http%3A%2F%2Fcyimg.quji.com%2Fnewsimg%2F2016%2F02%2F19%2F0449ff918e2484761f2dee7af1432108.jpg",'luban.jpg')# urlencode函數(shù),可以把字典數(shù)據(jù)轉(zhuǎn)換成url編碼的數(shù)據(jù)# data = {'name':'爬蟲基礎','greet':'hello world','age':100} # qs = parse.urlencode(data) # print(qs)# 案例 # url = 'http://www.baidu.com/s?wd=劉德華' url = 'http://www.baidu.com/s' params = {"wd":"劉德華"} qs = parse.urlencode(params) print(qs) url = url + "?" + qs print(url) resp = request.urlopen(url) print(resp.read())# parse_qs函數(shù),可以將經(jīng)過編碼后的url參數(shù)進行解碼 print(parse.parse_qs(qs))

    總結(jié)

    以上是生活随笔為你收集整理的python网络爬虫系列(一)——urllib库(urlopen、urlretrieve、urlencode、parse-qs、urlparse和urlsplit、request.Request类)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。