目錄css
通用爬蟲通用爬蟲是搜索引擎抓取系統(百度、谷歌、搜狗等)的重要組成部分。主要是將互聯網上的網頁下載到本地,造成一個互聯網內容的鏡像備份。html
聚焦爬蟲(定向爬蟲):是面向特定需求的一種網絡爬蟲程序,他與通用爬蟲的區別在於:聚焦爬蟲在實施網頁抓取的時候會對內容進行篩選和處理,儘可能保證只抓取與需求相關的網頁信息。python
HTTP(Hyper Transfer Protocal)協議,中文名爲超文本傳輸協議,是一種發佈和接收HTML頁面的方法。服務器端口號是80
端口。json
HTTPS協議,是HTTP協議的加密版本,在HTTP下加入了SSL層。服務器端口號是443
端口。c#
當瀏覽器向服務器發送HTTP請求時,它就會發送一個Request
請求html
文件,服務器就會把Response
文件對象發送回瀏覽器。當瀏覽器在分析Response
中的html
,發現其中引用了不少如css
的其餘文件,那麼瀏覽器就會自動地再次發送Response
去獲取其餘文件。瀏覽器
URL
是Uniform Resource Locator的簡稱,稱爲統一資源定位符。服務器
scheme://host:port/path/?query-string=xxx#anchor
cookie
scheme
表明訪問的協議,有http
、https
和ftp
等。網絡
host
表明主機,域名。session
post
表明端口號,瀏覽器默認爲80
。
path
查找的路徑。如https://www.zhihu.com/question/317729805/answer/634561449
中question/317729805/answer/634561449
就是路徑。
query-string
查詢字符串,如www.baidu.com/s?wd=python
其中wd=python
就是查詢字符串。
anchor
網頁的錨點
User-Agent
瀏覽器的名稱,經過爬蟲請求的話默認是python
。所以,若是咱們想要正常獲取信息的話,就須要把這個值設置成一些瀏覽器的值。
Referer
表面當前這個請求時從哪一個URL
發送過來的,若是不是指定的頁面,那麼就不作任何響應。
Cookie``HTTP
協議是無狀態的,所以須要用Cookie
來作標識。若是想要訪問登錄後才能訪問的網站,那麼就須要發送Cookie
信息。
urllib
庫urllib
庫能夠模擬瀏覽器的行爲,向指定的服務器發送一個請求,並能夠保持服務器返回的數據。全部和網絡請求相關的方法,都被蒐集到了urllib.request
模塊下了。
urlopen
函數from urllib import request resp = request.urlopen("https://www.cnblogs.com") print((resp.read()).decode("utf-8"))
該函數向URL
發送請求,而後返回一個叫http.client.HTTPResponse
的類文件句柄的對象。其有read
、readline
、readlines
和getcode
等方法。
urlretrieve
該函數與urlopen
函數相似,不過它能夠把文件下載下來。
from urllib import request request.urlretrieve("https://www.cnblogs.com","blog.html")
urlencode
函數當瀏覽器向服務器發送請求時,會自動的把中文或者其餘特殊字符進行編碼。若是咱們用代碼來發送請求就須要用urlencode
函數來進行編碼,它能夠把字典數據轉換成URL
編碼的數據。
from urllib import parse data = { "name":"袁銘", "hometown":"眉山" } qs = parse.urlencode(data) print(qs) """ name=%E8%A2%81%E9%93%AD&hometown=%E7%9C%89%E5%B1%B1 """
parse_qs
函數利用parse_qs
函數能夠對url
參數進行解碼。
from urllib import parse qs = "name=%E8%A2%81%E9%93%AD&hometown=%E7%9C%89%E5%B1%B1" data = parse.parse_qs(qs) print(data) ''' {'name': ['袁銘'], 'hometown': ['眉山']} '''
urlparse
和urlsplit
函數urlparse
函數和urlsplit
函數能夠對url
中的各個部分進行分割。其中urlparse
會生成一個SplitResult
對象,而urlparse
會生成一個ParseResult
對象,且比SplitResult
多一個params
屬性。
##urlparse()函數 from urllib import request,parse url = "https://baijiahao.baidu.com/s?id=1629848884406903523&wfr=spider&for=pc" res = parse.urlparse(url) print(res) """ result: ParseResult(scheme='https', netloc='baijiahao.baidu.com', path='/s', params='', query='id=1629848884406903523&wfr=spider&for=pc', fragment='') """
##urlsplit()函數 from urllib import request,parse url = "https://baijiahao.baidu.com/s?id=1629848884406903523&wfr=spider&for=pc" res = parse.urlsplit(url) print(res) """ result: SplitResult(scheme='https', netloc='baijiahao.baidu.com', path='/s', query='id=1629848884406903523&wfr=spider&for=pc', fragment='') """
params
屬性params
屬性用的比較少,url = 'http://www.baidu.com/s;hello?wd=python&username=abc#1'
中,hello
就是params
屬性。好比:
from urllib import request,parse url = 'http://www.baidu.com/s;hello?wd=python&username=abc#1' res = parse.urlparse(url) print(res.params) """ result: hello """
request.Request
類在request.Request
類裏面能夠添加一些請求頭。
from urllib import request headers = { "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36" } resp = request.Request("https://baijiahao.baidu.com/s?id=1629848884406903523&wfr=spider&for=pc",headers=headers) res = request.urlopen(resp) print(res.read().decode("utf-8"))
ProxyHandler
處理器(代理設置)經過這個設置能夠防止由於一個IP
地址屢次訪問一個網站而被禁止訪問的現象。
from urllib import request handler = request.ProxyHandler({"http":"116.209.56.20"}) opener = request.build_opener(handler) req = request.Request("https://httpbin.org/ip") res = opener.open(req) print(res.read())
Cookie
及其在python
爬蟲中應用http
請求是無狀態的,即第一次和服務器鏈接登錄後,第二次依然須要登錄,這樣咱們就須要Cookie
了。Cookie
是指網站服務器爲了辨別用戶身份和進行Session
跟蹤,而儲存在用戶瀏覽器上的文本文件,Cookie
能夠保持登陸信息到用戶下次與服務器的會話。通常的瀏覽器只會存儲4kb
大小的Cookie
信息。
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
協議下起做用
HTTPCookieProcessor
模擬登錄本身把相關Cookie
信息複製下來的方法
from urllib import request header = { "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36", "Cookie":'''_zap=7e00df33-291a-444c-bbd5-a577341759a3; d_c0="AJAneIGlfA6PTmd1grAygRROsv0NXxdm5CY=|1541663054"; _xsrf=0drRAYeKwmdbZ11UYOF8cJy9ZRT1cMec; z_c0="2|1:0|10:1543657267|4:z_c0|92:Mi4xSHFOUEJnQUFBQUFBa0NkNGdhVjhEaVlBQUFCZ0FsVk5NNlh2WEFBckU4ZE5mUjRPdHdzTFpiMS1uXzRHTUFRdWVn|b16b34b217ea382b1094e15ca41eac496c65ae276e30a492b77ab06b4824561d"; __gads=ID=72e38c174d9d49c9:T=1547028103:S=ALNI_Maqfn0xeXVKXQ3l2ty6KhIGzTq6wg; tst=r; __utma=51854390.323199518.1550992135.1550992135.1550992135.1; __utmz=51854390.1550992135.1.1.utmcsr=zhihu.com|utmccn=(referral)|utmcmd=referral|utmcct=/; __utmv=51854390.100--|2=registration_date=20171026=1^3=entry_date=20171026=1; q_c1=69c989b9edc24cc991722eaef9f39ec0|1552728574000|1541663056000''' } resq = request.Request("https://www.zhihu.com/",headers=header) res = request.urlopen(resq) with open("pachong.html","wb") as f: f.write(res.read())
http.cookiejar
模塊該模塊具備如下的幾個類:
CookieJar
:管理、存儲和向外傳輸HTTP Cookie
FileCookieJar(filename,delayload=None,policy=None)
:該模塊是從CookieJar
派生來的,能夠建立FileCookieJar
實例,並把相關信息存儲到文件裏。
filename
:存儲Cookie
的文件名delayload
:該屬性爲True
時,支持延遲訪問文件MozillaCookieJar(filename,delayload=None,policy=None)
:該模塊從FileCookieJar
派生而來,建立與Mozilla瀏覽器cookies.txt
兼容的FileCookieJar
實例LWPCookieJar(filename,delayload=None,policy=None)
:也是從FileCookieJar
派生而來,建立與libwww-perl
標準的Set-Cookie3
文件格式兼容的FileCookieJar
實例from urllib import parse,request from http.cookiejar import CookieJar headers = { "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36" } cookiejar = CookieJar() handle = request.HTTPCookieProcessor(cookiejar) opener = request.build_opener(handle) data = { "username":"***********", "password":"***********" } ##存儲登錄帳號和密碼,對應的參數能夠在html源代碼中查找 data = parse.urlencode(data).encode("utf-8") login_url = "https://www.zhihu.com/signup?next=%2F" ##使用登錄頁面的url req = request.Request(login_url,headers=headers,data=data) opener.open(req) ##登錄並得到Cookie url = "https://www.zhihu.com/question/60371302/answer/632445421" req = request.Request(url,headers=headers) resp = opener.open(req) with open("zhihu.html","wb") as f: f.write(resp.read())
Cookie
本地化和本地加載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)##若是斷開Cookie就消失的話,就應該設置`save()`函數裏面的參數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())
requests
庫get
及其實例化的屬性params
:接受一個字典或者字符串的查詢參數,其不須要urlencode()
就能夠轉換成url
編碼,如requests.get("https://www.baidu.com/s",kw,headers=heads)
,其中kw={"wd":"python}
,它會自動地把url
拼接爲https://www.baidu.com/s?wd=pyhon
text
:返回Unicode格式的內容content
:返回字節流數據,其會自動幫你解碼,可是容易出錯url
:返回其完整的url地址encoding
:查看響應頭部字符編碼status_code
:查看響應碼import requests kw = { "wd":"python" } headers = { "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36" } resp = requests.get("http://www.baidu.com/s",params = kw,headers=headers) with open("res.html","w",encoding="utf-8") as f: f.write(resp.content.decode("utf-8"))
post
及其小實例import requests url = "https://www.lagou.com/jobs/positionAjax.json?city=%E6%B7%B1%E5%9C%B3&needAddtionalResult=false&isSchoolJob=0" 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', 'Referer': 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=' } data = { 'first': 'true', 'pn': 1, 'kd': 'python' } resp = requests.post(url,headers=headers,data=data) # 若是是json數據,直接能夠調用json方法 print(resp.json())
import requests url = "http://httpbin.org/ip" headers = { "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36" } proxy = { "http":"182.34.37.198:9999" } resp = requests.get(url,headers=headers,proxies=proxy) ##直接傳入get()函數裏面 print(resp)
Cookie
的獲取import requests url = "https://www.zhihu.com/signup?next=%2F" data = { "username":"15244847273", "password":"GNIM@yuan#88" } headers = { "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36" } resp = requests.get(url) c_s = resp.cookies ##調用cookie這個屬性來得到cookie值 print(c_s.get_dict()) ##get_dict()函數會把產生的對象返回成字典的形式
Session
利用該類能夠創建一個會話
import requests url = "https://www.zhihu.com/signup?next=%2F" data = { "username":"***********", "password":"***********" } headers = { "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36" } session = requests.Session() session.post(url,data=data,headers=headers) reps = session.get("https://www.zhihu.com/question/317115184/answer/631075262") print(reps.text)
resp = requests.get("URL",verify=False)
在get()
函數裏面加入verify=False
參數就能夠處理了