爬蟲請求

爬蟲的分類

  • 通用爬蟲通用爬蟲是搜索引擎抓取系統(百度、谷歌、搜狗等)的重要組成部分。主要是將互聯網上的網頁下載到本地,造成一個互聯網內容的鏡像備份。html

  • 聚焦爬蟲(定向爬蟲):是面向特定需求的一種網絡爬蟲程序,他與通用爬蟲的區別在於:聚焦爬蟲在實施網頁抓取的時候會對內容進行篩選和處理,儘可能保證只抓取與需求相關的網頁信息。python

HTTP協議

HTTP(Hyper Transfer Protocal)協議,中文名爲超文本傳輸協議,是一種發佈和接收HTML頁面的方法。服務器端口號是80端口。json

HTTPS協議,是HTTP協議的加密版本,在HTTP下加入了SSL層。服務器端口號是443端口。c#

HTTP請求過程

當瀏覽器向服務器發送HTTP請求時,它就會發送一個Request請求html文件,服務器就會把Response文件對象發送回瀏覽器。當瀏覽器在分析Response中的html,發現其中引用了不少如css的其餘文件,那麼瀏覽器就會自動地再次發送Response去獲取其餘文件。瀏覽器

URL詳解

URL是Uniform Resource Locator的簡稱,稱爲統一資源定位符。服務器

scheme://host:port/path/?query-string=xxx#anchorcookie

  • scheme表明訪問的協議,有httphttpsftp等。網絡

  • host表明主機,域名。session

  • post表明端口號,瀏覽器默認爲80

  • path查找的路徑。如https://www.zhihu.com/question/317729805/answer/634561449question/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的類文件句柄的對象。其有readreadlinereadlinesgetcode等方法。

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': ['眉山']}
'''

urlparseurlsplit函數

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)

不被信任的SSL證書處理

resp = requests.get("URL",verify=False)

get()函數裏面加入verify=False參數就能夠處理了

相關文章
相關標籤/搜索