深圳專業(yè)做網(wǎng)站技術(shù)公司網(wǎng)絡(luò)推廣方案
一、爬蟲的基本概念
1.什么是爬蟲?
????????????????請(qǐng)求網(wǎng)站并提取數(shù)據(jù)的自動(dòng)化程序
2.爬蟲的分類
??? 2.1 通用爬蟲(大而全)
??????? 功能強(qiáng)大,采集面廣,通常用于搜索引擎:百度,360,谷歌
??? 2.2 聚焦爬蟲,主題爬蟲(小而精)
??????? 功能相對(duì)單一(只針對(duì)特定的網(wǎng)站的特定內(nèi)容進(jìn)行爬取)
??? 2.3增量式爬蟲(只采集更新后的內(nèi)容)
??????? 爬取更新后的內(nèi)容,新聞,漫畫,視頻…(區(qū)分新老數(shù)據(jù))
3.ROOT協(xié)議
????????什么是robots協(xié)議?
????????3.1 Robots協(xié)議的全稱是"網(wǎng)絡(luò)爬蟲排除標(biāo)準(zhǔn)" (Robots Exclusion Protocol),簡稱為Robots協(xié)議。
????????3.2 Robots協(xié)議的一個(gè)很重要作用就是網(wǎng)站告知爬蟲哪些頁面可以抓取,哪些不
行。君子協(xié)定:指代的是口頭上的協(xié)議,如果爬取了,可能會(huì)出現(xiàn)法律糾紛(商用).
二、爬蟲的基本流程
1.發(fā)起請(qǐng)求
????????通過HTTP庫向目標(biāo)站點(diǎn)發(fā)起請(qǐng)求,即發(fā)起一個(gè)Request,請(qǐng)求可以包含額外的headers信息,等待服務(wù)器響應(yīng)。
2.獲取響應(yīng)內(nèi)容
????????如果服務(wù)器能正常響應(yīng),會(huì)得到一個(gè)Response,Response的內(nèi)容便是索要獲取的頁面內(nèi)容,類型可能有HTML,Json字符串,二進(jìn)制數(shù)據(jù)(如圖片視頻)等類型
3.解析內(nèi)容
????????得到的內(nèi)容可能是HTML,可以用正則表達(dá)式、網(wǎng)頁解析庫進(jìn)行解析,可能是Json,可以直接轉(zhuǎn)為Json對(duì)象解析,可能是二進(jìn)制數(shù)據(jù),可能做保存或進(jìn)一步處理
4.保存數(shù)據(jù)
?????? 保存形式多樣,可以保存為文本,也可保存至數(shù)據(jù)庫或者保存特定格式的文件
三、Request和Response
????????1.瀏覽器就發(fā)送消息給該網(wǎng)址所在的服務(wù)器,這個(gè)過程叫做HTTP Request。
????????2.服務(wù)器收到瀏覽器發(fā)送的消息后,能夠根據(jù)瀏覽器發(fā)送消息的內(nèi)容,做相應(yīng)處理,然
后把消息回傳給瀏覽器。這個(gè)過程叫做HTTP Response。
????????3.瀏覽器收到服務(wù)器的Response信息后,會(huì)對(duì)信息進(jìn)行相應(yīng)處理,然后展示。
????????4.Request
??? ????4.1 主要有GET、POST兩種類型
????????4.2 URL全稱統(tǒng)一資源定位符,如一個(gè)網(wǎng)頁文檔、一張圖片、一個(gè)視頻等都可
????????以用URL唯一來確定。
????????4.3 包含請(qǐng)求時(shí)的頭部信息,如User-Agent、Host、Cookies等信息。???????
????????4.4 請(qǐng)求時(shí)額外攜帶的數(shù)據(jù)如表單提交時(shí)的表單數(shù)據(jù)。
????????5.Reponse
??????? 5.1 響應(yīng)狀態(tài)
有多種響應(yīng)狀態(tài),如200代表成功、301跳轉(zhuǎn)、404找不到頁面、502服務(wù)器錯(cuò)誤
??????? 5.2 響應(yīng)頭
?????????? 如內(nèi)容類型、內(nèi)容長度、服務(wù)器信息、設(shè)置Cookie等等。
??????? 5.3 響應(yīng)體
?????????? 最主要的部分,包含了請(qǐng)求資源的內(nèi)容, 如網(wǎng)頁HTML、圖片二進(jìn)制數(shù)據(jù)等。
注意:在監(jiān)測的時(shí)候用Ctrl+F調(diào)出搜索框
四、Requests模塊
?????? 作用:發(fā)送網(wǎng)絡(luò)請(qǐng)求,或得響應(yīng)數(shù)據(jù)
開源地址:https://github.com/kennethreitz/requestshttps://github.com/kennethreitz/requests
安裝: pip install requests -i https://pypi.douban.com/simple/
?????? 中文文檔 API: http://docs.python-requests.org/zh_CN/latest/index.htmlhttp://docs.python-requests.org/zh_CN/latest/index.html
?????? 官方文檔:??? Requests: 讓 HTTP 服務(wù)人類 — Requests 2.18.1 文檔https://requests.readthedocs.io/projects/cn/zh-cn/latest/
1.Requests請(qǐng)求
只能得到一個(gè)包的數(shù)據(jù)
url = 'https://www.baidu.com/'
response = requests.get(url)
print(response)#返回的是一個(gè)響應(yīng)體對(duì)象print(response.text)#獲取響應(yīng)體內(nèi)容print(response.status_code)#響應(yīng)狀態(tài)碼
Get請(qǐng)求
url = 'https://httpbin.org/get'#url = 'https://httpbin.org/get?age=18&&name=zhangsan'data = {'name':'zhangsan','age':19}response = requests.get(url,params=data)#params攜帶get請(qǐng)求的參數(shù)進(jìn)行傳參print(response.text)
Post請(qǐng)求
rl = 'https://httpbin.org/post'data = {'name':'zhangsan','age':19}response = requests.post(url,data=data)#data:攜帶post請(qǐng)求需要的表單數(shù)據(jù),在form里面形成print(response.text)
自己理解:
對(duì)于Get來說,主要在網(wǎng)址輸入時(shí)即輸入U(xiǎn)RL的時(shí)候用到,而POST則是在網(wǎng)頁里面,比如翻譯時(shí)的單詞輸入等
??????
獲取Json數(shù)據(jù)
url = 'https://httpbin.org/get'result = requests.get(url)result_data = result.json()print(result_data)print(type(result_data))
會(huì)發(fā)現(xiàn)Py里面的Json數(shù)據(jù)就是字典類型
獲取二進(jìn)制據(jù)數(shù)據(jù)
url = 'https://b.bdstatic.com/searchbox/icms/searchbox/img/ci_boy.png'result = requests.get(url)#print(result.text) #二進(jìn)制數(shù)據(jù)轉(zhuǎn)文本會(huì)顯示亂碼,strprint(result.content)#會(huì)發(fā)現(xiàn)是以b開頭的bite類型二進(jìn)制數(shù)據(jù),bytesdata = result.contentwith open('TuPian.png','wb') as f:? #wb是寫入二進(jìn)制f.write(data)
初步偽裝小爬蟲——添加headers
????????????? 瀏覽器用戶身份的標(biāo)識(shí),缺少的話服務(wù)器會(huì)認(rèn)為你不是一個(gè)正常的瀏覽器用戶,而是一個(gè)爬蟲程序
?????? User-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0
import requestsimport fake_useragentua = fake_useragent.UserAgent()ua_fake = ua.chromeurl = 'https://www.jianshu.com/'headers = {#'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0''User-Agent':ua_fake}result = requests.get(url,headers = headers)print(result.text)
會(huì)話維持
?????? 例如爬取簡書的收藏的時(shí)候,如果不登陸就無法爬取,可以在headers里面增加cookie內(nèi)容即可,但要注意的是cookie有對(duì)應(yīng)的時(shí)間
import requestsimport fake_useragentua = fake_useragent.UserAgent()ua_fake = ua.chromeurl = 'https://www.jianshu.com/'headers = {#'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0''User-Agent':ua_fake,'cookie':''}result = requests.get(url,headers = headers)print(result.text)
代理
import requestsp = {'http':'120.41.143.139:21037','https':'120.41.143.139:21037',
}url = 'https://www.jianshu.com/'headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0'}result = requests.get(url,headers = headers,proxies=p)print(result.text)
?????? 注意的是這里的ip無效,后面繼續(xù)展開
五、正則表達(dá)式
?????? 1.正則表達(dá)式是對(duì)字符串操作的一種邏輯公式,就是用事先定義好的一些特殊字符以及這些特殊字符的組合,組成一個(gè)“規(guī)則字符串”,這個(gè)“規(guī)則字符串”用來表達(dá)對(duì)字符串的一種邏輯過濾
?????? 2.非Python獨(dú)有
????????3.Python里面是使用re模塊來實(shí)現(xiàn)的,不需要額外進(jìn)行安裝,是內(nèi)置模塊
常見匹配模式
? ? ? ? ? ? ?
??????
re.match()方法的使用
import re#content = 'Hello 123 456789 World_This is a Regex Demo'#re.match('正則表達(dá)式','目標(biāo)字符串')#result = re.match('Hello\s\d\d\d\s\d{6}\s\w{10}',content)#print(result.group())#result = re.match('H.*Demo',content)#result = re.match('Hello\s(\d{3})\s(\d{6})',content)#print(result.group(1))? #這里0表示最先出現(xiàn)的括號(hào),1表示第二次出現(xiàn)的括號(hào)#print(result.group(1,2))??? #這是一個(gè)元組,后面處理較麻煩#content = 'Hello 123456789 World_This is a Regex Demo'#result = re.match('He.*(\d+).*Demo',content)#因?yàn)樨澙纺J降拇嬖?#xff0c;在He之后,Demo之前至少有一個(gè)數(shù)字字符,即9#print(result.group(1)) #打印的為9#加上?后,即為非貪婪#result = re.match('He.*?(\d+).*Demo',content)#print(result.group(1))#content = """Hello 123456789#World_This# is a Regex#? Demo"""#result = re.match('He.*?(\d+).*Demo',content,re.S)#re.S忽略換行符#print(result.group())#\轉(zhuǎn)義符,如果對(duì)\轉(zhuǎn)義,則需要兩個(gè)\\,也可以直接寫r,再接一個(gè)\#content = 'price is $9.99'#result = re.match('price\sis\s\$9.99',content) #$這個(gè)在正則表達(dá)式有自己的含義#print(result.group())
search方法
search全文檢索,返回滿足表達(dá)式的第一個(gè)
#result = re.search('<a\s\href="/3.mp3"\ssinger="(.*)">(.*)</a>',html)#print(result.group(1))
Findall方法
用一個(gè)大列表返回滿足所有的正則表達(dá)式結(jié)果
#result = re.findall('<a\s\href="(.*)"\ssinger="(.*)">(.*)</a>',html)#for i in result:#?? print(i)
Re.sub()
#re.sub('要替換的目標(biāo)的正則表達(dá)式','想要將前面匹配到的數(shù)據(jù)替換成什么','目標(biāo)字符串')#sub_html = re.sub('<i.*</i>','',html)#result = re.findall('<a\s\href="(.*)"\ssinger="(.*)">(.*)</a>',sub_html)#for i in result:#?? print(i)