爬蟲二(urllib模塊)

1、在python2和python3中的差異

在python2中,urllib和urllib2各有各自的功能,雖然urllib2是urllib的升級版,但是urllib2還是不能完全替代urllib,但是在python3中,全部封裝成一個類,即urllib

python2中urllib2和urllib的區別:

Urllib2可以接受一個Request對象,并以此可以來設置一個URL的headers,但是urllib只接受一個URL。這就意味著你不能通過urllib偽裝自己的請求頭。Urllib模板可以提供運行urlencode的方法,該方法用于GET查詢字符串的生成,urllib2的不具備這樣的功能,而且urllib.quote等一系列quote和unquote功能沒有被加入urllib2中,因此有時也需要urllib的輔助。這就是urllib和urllib2一起使用的原因,quote用來url轉碼的

import urllib.request
urllib.request.Request(url, data=None, headers = {}, method= None)

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
'Referer': 'http://www.lagou.com/zhaopin/Python/?labelWords=label',
'Connection': 'keep-alive'
}

http的頭信息可以直接使用字典的形式

Request如果要發送data,并無法直接傳入字典類型的參數,需要進行數據轉換,你可以直接使用類似于get傳出參數的方法,也可以使用urllib給我們提供的類

from urllib import request, parse
data = {
'first': 'true',
'pn': 1,
'kd': 'Python'
}
data = parse.urlencode(data).encode('utf-8')
print(data)

#結果:
b'first=true&pn=1&kd=Python‘
urllib.parse.urlencode(query, doseq=False, safe='', encoding=None, errors=None)
urlencode()主要作用就是將url附上要提交的數據。Post的數據必須是bytes或者iterable of bytes,不能是str,因此需要進行encode()編碼

urllib.request.urlopen(url, data=None, timeout=None)

  • url??? 需要打開的網站
  • data??? psot提交的數據
  • Timeout?????? 網站訪問的超時時間

但是沒法偽裝我們的頭信息

from urllib import request
req = request.Request(url, headers=headers, data=data)
html = request.urlopen(req).read()

2、urllib的下載

from urllib import request

url = "http://inews.gtimg.com/newsapp_match/0/2711870562/0"
request.urlretrieve(url, "1.jpg")

或者通過

from urllib import request

url = "http://inews.gtimg.com/newsapp_match/0/2711870562/0"
req = request.Request(url)
res = request.urlopen(req)
text = res.read()
with open("2.jpg", "wb") as f:
f.write(text)

3、urllib的代理

from urllib import request, parse

data = {
'first': 'true',
'pn': 1,
'kd': 'Python'
}
url = 'http://2017.ip138.com/ic.asp'

proxy = request.ProxyHandler({'http': '112.95.61.146:8118'}) # 設置proxy
opener = request.build_opener(proxy) # 掛載opener
# opener = request.build_opener() # 掛載opener
request.install_opener(opener) # 安裝opener
data = parse.urlencode(data).encode('utf-8')
page = opener.open(url, data).read()
print(type(page))
print(page.decode("gbk"))

結果:<body style="margin:0px"><center>您的IP是:[112.95.61.146] 來自:廣東省深圳市 聯通</center></body></html>

4、urllib的cookie使用

如果已經知道cookie,或者說你是通過抓包獲取到的cookie,直接放在header的信息中直接登陸就可以,登陸京東網站的cookie信息和不登錄京東的cookie信息是不一樣的,你可以登錄京東以后,抓取cookie的信息,然后訪問任何網站就可以了

import urllib.request
url = "http://www.jd.com"
header = {"user-agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
"cookie": "xxxxx"}
req = urllib.request.Request(url=url, headers=header)
res = urllib.request.urlopen(req)
text = res.read()

5、urllib的cookie相關的類

  • 在python2中cookie的類叫做:import cookielib
  • 在python3中cookie的類叫做:import http.cookiejar

6、opener的概念

  • 當你獲取一個URL你使用一個opener(一個urllib2 OpenerDirector的實例)。在前面,我們都是使用的默認的opener,也就是urlopen
  • urlopen是一個特殊的opener,可以理解成opener的一個特殊實例,傳入的參數僅僅是url,data,timeout
  • 如果我們需要用到Cookie,只用這個opener是不能達到目的的,所以我們需要創建更一般的opener來實現對Cookie的設置

7、終端輸出cookie對象

import urllib.request
import http.cookiejar

url = "http://www.hao123.com"
req = urllib.request.Request(url)
cookiejar = http.cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookiejar)
opener = urllib.request.build_opener(handler)
r = opener.open(req)
print(cookiejar)

輸出:
<CookieJar[<Cookie BAIDUID=93B415355E0704B2BC94B5D514468898:FG=1 for .hao123.com/>, <Cookie hz=0 for .www.hao123.com/>, <Cookie ft=1 for www.hao123.com/>, <Cookie v_pg=normal for www.hao123.com/>]>

8、Cookie保存到文件中

import urllib.request
import http.cookiejar

url = "http://www.hao123.com"
req = urllib.request.Request(url)

cookieFileName = "cookie.txt"
cookiejar = http.cookiejar.MozillaCookieJar(cookieFileName)#文件cookie
handler = urllib.request.HTTPCookieProcessor(cookiejar)
opener = urllib.request.build_opener(handler)
r = opener.open(req)
print(cookiejar)
cookiejar.save()

保存在了文件cookie.txt中

MozillaCookieJar繼承FileCookieJar()繼承CookieJar

9、Cookie從文件中讀取cookie信息并訪問

import urllib.request
import http.cookiejar
cookie_filename = 'cookie.txt'
cookie = http.cookiejar.MozillaCookieJar(cookie_filename)
cookie.load(cookie_filename, ignore_discard=True, ignore_expires=True)
print(cookie)
url = "http://www.hao123.com"
req = urllib.request.Request(url)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler) # 利用urllib2的build_opener方法創建一個opener
response = opener.open(req)

print(response.read().decode(“utf-8”))#解決亂碼的問題

?

轉載于:https://www.cnblogs.com/Jweiqing/p/9189367.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452298.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452298.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452298.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

逆向工程

軟件的逆向工程是分析程序以便在比源代碼更高的抽象層次上創建出程序的某種表示的過程&#xff0c;也就是說&#xff0c;逆向工程是一個恢復設計結果的過程&#xff0c;逆向工程工具從現存的程序代碼中抽取有關數據、體系結構和處理過程的設計信息。 簡單的說根據已有的東西和…

protocol buffer使用小例

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 、使用EditPlus定義好一份proto文件&#xff08;用EditPlus是為了不出現亂碼&#xff09;&#xff0c;如下 &#xff1a; package mypac…

2000服務器文件共享,Win2000 Server實現對共享文件的監控

病毒的出現&#xff0c;使我們在共享文件時變得異常小心。那么&#xff0c;有沒有辦法監控共享文件的使用情況并加以管理呢&#xff1f;有&#xff0c;用Windows 2000 Server的文件共享監控功能就可以實現。Windows 2000 Server的共享管理功能在“計算機管理”中&#xff0c;它…

學成在線--1.CMS接口開發

文章目錄0.定義CMS1.CMS頁面管理2.需求分析3.模型類介紹4.定義請求及響應類型5.定義接口6.創建CMS工程結構7.Dao1&#xff09;創建Dao&#xff0c;繼承MongoRepository2&#xff09;編寫測試類分頁查詢測試添加刪除修改8.Service9.Controller10.接口開發規范0.定義CMS 1&#…

django 進階

django進階 django的分頁器 基礎語法&#xff1a; View Code簡單練習&#xff1a; View Code實例應用&#xff1a; View Code自定義分頁&#xff1a; View Codeform表單系統 原生form View CodeDjango表單系統中&#xff0c;所有的表單類都作為django.forms.Form的子類創建&…

BZOJ 2440: [中山市選2011]完全平方數

Time Limit: 10 Sec Memory Limit: 128 MB Submit: 5160 Solved: 2515 [Submit][Status][Discuss] Description 小 X 自幼就很喜歡數。但奇怪的是&#xff0c;他十分討厭完全平方數。他覺得這些 數看起來很令人難受。由此&#xff0c;他也討厭所有是完全平方數的正整數倍的…

如何減小與“大牛”的差距

為什么同樣的時間有的人可以漂亮的完成工作&#xff0c;而有些人廢了很大的力氣也沒有完成&#xff1f; 前者我們常常稱之為“大牛”&#xff0c;后者我們常常叫他們“菜鳥”。當然“大牛”都是相對而言的&#xff0c;“大牛”也不可能方方面面都非常厲害&#xff0c;換句話說大…

軟件再工程

軟件再工程是指對既存對象系統進行調查&#xff0c;并將其重構為新形式代碼的開發過程。最大限度地重用既存系統的各種資源是再工程的最重要特點之一。從軟件重用方法學來說&#xff0c;如何開發可重用軟件和如何構造采用可重用軟件的系統體系結構是兩個最關鍵問題。不過對再工…

武俠乂怎么修改服務器,武俠乂怎么操作 按鍵功能詳細介紹

武俠乂將在7月27日開啟限量測試了&#xff0c;入手前的第一件事情當然要熟悉操作按鍵了&#xff0c;下面給大家帶來的是武俠乂按鍵介紹&#xff0c;一起來看看吧。武俠乂將在7月27日開啟限量測試了&#xff0c;玩家們馬上就能體會到武俠吃雞的快感&#xff0c;除了吃雞模式外還…

RMI使用小例

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1、定義一個接口&#xff08;繼承Remote&#xff09;&#xff1a; 方法要拋RemoteException。 package rmi; import java.rmi.RemoteEx…

產品經理和項目經理有哪些區別?

1.產品經理和項目經理的差異 首先&#xff0c;產品經理和項目經理的職責定義不太一樣。 產品經理是 Product Manager &#xff0c;主要是負責市場調研、用戶研究并根據用戶的需求&#xff0c;定義和設計產品&#xff0c;然后考慮產品的商業模式、運營推廣方式等。接下來去推動…

09-完整性約束

本節重點&#xff1a; not null 與 defaultuniqueprimaryauto_incrementforeign key一、介紹 約束條件與數據類型的寬度一樣&#xff0c;都是可選參數 作用&#xff1a;用于保證數據的完整性和一致性 主要分為&#xff1a; PRIMARY KEY (PK) #標識該字段為該表的主鍵&#x…

fread rb與r,wb,w的區別

在fread時&#xff0c;"rb"與"r"對某些字符作用&#xff0c;是不同的&#xff1b; 文本模式和二進制模式讀取不一樣的 文本&#xff1a;讀: 遇到回車-換行(0D 0A)&#xff0c;就會轉換為換行符0A 寫&#xff1a;遇到換行符0A&#xff0c;就會轉換為回車-換…

軟件正向工程

正向工程是通過實現語言的映射而把模型轉換為代碼的過程。正向工程也稱為革新或改造&#xff0c;這項活動不僅從現有程序中恢復設計信息&#xff0c;而且使用該信息去改變或重構現有系統&#xff0c;以提高其整體質量。 換句話說&#xff1a;一般工業產品開發是從確定預期功能…

學成在線--2.CMS前端頁面查詢開發

文章目錄0.思路總結1.創建CMS模塊的目錄架構2.創建頁面并配置路由1&#xff09;在page目錄新建page_list.vue&#xff0c;擴展名為.vue。2&#xff09;在cms的router下配置路由。3&#xff09;在base目錄下的router導入cms模塊的路由3.使用Table組件完善頁面內容4.Api調用服務器…

java.util.IdentityHashMap.entrySet()方法實例

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 entrySet() 方法是用來獲取此映射中包含的映射關系的set視圖。 聲明 以下是java.util.IdentityHashMap.entrySet()方法的聲明。 publ…

URL轉微信可識別的二維碼

jquery.qrcode.js 是一個能夠在客戶端生成矩陣二維碼QRCode 的jquery插件 &#xff0c;使用它可以很方便的在頁面上生成二維條碼。 用法&#xff1a; 1、引入jquery.qrcode.min.js <script src"jquery.min.js"></script> <script src"jquery.qrc…

javascript數組及操作方法

數組及操作方法 數組就是一組數據的集合&#xff0c;javascript中&#xff0c;數組里面的數據可以是不同類型的。 定義數組的方法 //對象的實例創建 var aList new Array(1,2,3);//直接量創建 var aList2 [1,2,3,asd];操作數組中數據的方法 1、獲取數組的長度&#xff1a;aLi…

如何創建比C語言更快的編程語言?

【CSDN編譯整理】近日&#xff0c;beza1e1上發表了一篇博客《Faster than C》&#xff0c;在Hacker News和Reddit Programming上引發了開發者們的激烈討論。現將此文編譯&#xff0c;我們一起來探討下。 單從編程語言特性來判斷&#xff0c;雖然Fortran語言也以快而著稱&#…

面向對象方法學

面向對象技術強調在軟件開發過程中面向客觀世界或問題域中的事物&#xff0c;采用人類在認識客觀世界的過程中普遍運用的思維方法&#xff0c;直觀、自然地描述客觀世界中的有關事物。 面向對象的分析方法是利用面向對象的信息建模概念&#xff0c;如實體、關系、屬性等&#x…