1.認(rèn)識(shí)爬蟲
我們所熟悉的一系列搜索引擎都是大型的網(wǎng)絡(luò)爬蟲,比如百度引矩、搜狗、360瀏覽器掏觉、谷歌搜索等澳腹。每個(gè)搜索引擎都擁有自己的爬蟲程序酱塔,比如360瀏覽器的爬蟲稱作360Spider延旧,搜狗的爬蟲叫做Sogouapider
2.爬蟲分類
爬蟲可分為三大類:通用網(wǎng)絡(luò)爬蟲、聚焦網(wǎng)絡(luò)爬蟲捌蚊、增量式網(wǎng)絡(luò)爬蟲
通用網(wǎng)絡(luò)爬蟲:是搜索引擎的重要組成部分缅糟,通用網(wǎng)絡(luò)爬蟲需要遵守robots協(xié)議窗宦,網(wǎng)站通過此協(xié)議告訴搜索引擎哪些頁面可以抓取赴涵,哪些頁面不可以抓取
聚焦網(wǎng)絡(luò)爬蟲:是面向特定需求的一種網(wǎng)絡(luò)爬蟲程序髓窜,它與通用爬蟲的區(qū)別在于欺殿,聚焦爬蟲在實(shí)施網(wǎng)頁抓取的時(shí)候會(huì)對網(wǎng)頁內(nèi)容進(jìn)行篩選和處理脖苏,盡量保證只抓取與需求相關(guān)的網(wǎng)頁信息棍潘,聚焦網(wǎng)絡(luò)爬蟲極大地節(jié)省了硬件和網(wǎng)絡(luò)資源,由于保存的頁面數(shù)量少所以更新速度很快至扰。
增量式網(wǎng)絡(luò)爬蟲:是指對已下載網(wǎng)頁采取增量式更新敢课,它是一種只爬取新產(chǎn)生的或者已經(jīng)發(fā)生變化網(wǎng)頁的爬蟲程序直秆,能夠在一定程度上保證爬取的頁面時(shí)最新的頁面
3.爬蟲應(yīng)用
1).數(shù)據(jù)分析
2).商業(yè)領(lǐng)域
4.為什么用python做爬蟲
不止python這一種語言可以做爬蟲圾结,諸如php筝野、java歇竟、c/c++都可以用來寫爬蟲程序焕议,但是相較于其他語言python做爬蟲是最簡單的
php:對多線程盅安、異步的支持語言不是很好java也經(jīng)常用來寫爬蟲程序别瞭,但java:java語言本身很笨重畜隶,代碼量大籽慢,因此入門的門檻較高箱亿;
c/c++:c/c++運(yùn)行效率雖然高届惋,但學(xué)習(xí)和開發(fā)成本也高脑豹,寫一個(gè)小型的爬蟲程序可能花費(fèi)很長的時(shí)間
而python語言瘩欺,其語法優(yōu)美俱饿,代碼簡潔拍埠,開發(fā)效率高枣购,支持·多個(gè)爬蟲模塊棉圈,比如urllib迄损、requests芹敌、Bs4等氏捞。python的請求模塊和解析模塊豐富成熟液茎,并且提供了強(qiáng)大的Scrapy框架捆等,讓寫爬蟲程序變得更為簡單
5.編寫python爬蟲的流程
- 先由urllib模塊的request方法打開url得到網(wǎng)頁HTML對象
- 使用瀏覽器打開網(wǎng)頁源代碼分析網(wǎng)頁結(jié)構(gòu)以及元素節(jié)點(diǎn)
- 通過Beautiful Soup或者正則表達(dá)式提取數(shù)據(jù)
- 存儲(chǔ)數(shù)據(jù)到本地磁盤或數(shù)據(jù)庫
6.簡單的python爬蟲程序
6-1.獲取網(wǎng)頁html信息
獲取響應(yīng)對象
向百度(http://www.baidu.com/)發(fā)起請求栋烤,獲取百度首頁的html信息明郭,代碼如下
import urllib.request
#或from urllib import request
#response = request.urlopen('http://www.baidu.com/')
resonse=urllib.request.urlopen('http://www.baidu.com/')
6-2.輸出HTML信息
#提取響應(yīng)內(nèi)容
html=response.read().decode('utf-8')
urllib常用方法
1).urlopen(url,timeout)
url:表示要爬取的url地址
timeout:設(shè)置等待超時(shí)時(shí)間始绍,指定時(shí)間內(nèi)未得到響應(yīng)則拋出超時(shí)異常
2).urllib.request.Request(url,headers)
url:請求的URL地址
headers:重構(gòu)請求頭
html響應(yīng)對象方法
bytes=response.read()#read()返回結(jié)果為bytes數(shù)據(jù)類型
string=response.read().decode()#decode()將字節(jié)串轉(zhuǎn)換為string類型
url=response.geturl()#返回響應(yīng)對象的url地址
code=response.getcode()#返回請求時(shí)的HTTP響應(yīng)碼
編碼解碼操作
string.encode('utf-8')#字符串轉(zhuǎn)換為字節(jié)碼
bytes.decode('utf-8')#字節(jié)碼轉(zhuǎn)換為字符串
7.User-Agent(用戶代理)是什么
User-Agent即用戶代理亏推,簡稱UA径簿,它是一個(gè)特殊字符串頭篇亭。網(wǎng)站服務(wù)器通過識(shí)別UA來確定用戶所使用的操作系統(tǒng)版本译蒂、CPU類型柔昼、瀏覽器版本等信息。而網(wǎng)站服務(wù)器則通過判斷UA來給客戶端發(fā)送不同的頁面
網(wǎng)絡(luò)爬蟲使用程序代碼網(wǎng)站乙嘀,因此爬蟲程序也被稱為網(wǎng)絡(luò)機(jī)器人虎谢,絕大多數(shù)網(wǎng)站都具備一定的反爬能力婴噩,禁止爬蟲大量的訪問網(wǎng)站几莽,以免給網(wǎng)站服務(wù)器帶來壓力银觅,User-Agent就是反爬策略的第一步
網(wǎng)站通過識(shí)別請求頭中User-Agent信息來判斷是否是爬蟲訪問網(wǎng)站究驴。如果是洒忧,網(wǎng)站首先對該IP進(jìn)行預(yù)警熙侍,對其進(jìn)行重點(diǎn)監(jiān)控蛉抓,當(dāng)發(fā)現(xiàn)該IP超過規(guī)定時(shí)間內(nèi)的訪問次數(shù)驶忌,將在一段時(shí)間內(nèi)禁止再次訪問網(wǎng)站
常見的 User-Agent 請求頭付魔,如下所示:
系統(tǒng) | 瀏覽器 | User-Agent字符串 |
---|---|---|
Mac | Chrome | Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36 |
Mac | Firefox | Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:65.0) Gecko/20100101 Firefox/65.0 |
Mac | Safari | Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.3 Safari/605.1.15 |
Windows | Edge | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763 |
Windows | IE | Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko |
Windows | Chrome | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36 |
iOS | Chrome | Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) CriOS/31.0.1650.18 Mobile/11B554a Safari/8536.25 |
iOS | Safari | Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12F70 Safari/600.1.4 |
Android | Chrome | Mozilla/5.0 (Linux; Android 4.2.1; M040 Build/JOP40D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36 |
Android | Webkit | Mozilla/5.0 (Linux; U; Android 4.4.4; zh-cn; M351 Build/KTU84P) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 |
注:httpbin.org這個(gè)網(wǎng)站能測試HTTP請求和響應(yīng)的各種信息陈哑,比如cookie惊窖、IP爬坑、headers和登錄驗(yàn)證等盾计,且支持GET/POST等多種方法
重構(gòu)爬蟲信息
下面使用urllib.request.Request()方法重構(gòu)User-Agent信息署辉,代碼如下:
import urllib.request
url = 'http://httpbin.org/get' #向測試網(wǎng)站發(fā)送請求
#重構(gòu)請求頭哭尝,偽裝成 Mac火狐瀏覽器訪問材鹦,可以使用上表中任意瀏覽器的UA信息
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:65.0) Gecko/20100101 Firefox/65.0'}
# 1栅葡、創(chuàng)建請求對象欣簇,包裝ua信息
req = urllib.request.Request(url=url,headers=headers)
# 2熊咽、發(fā)送請求横殴,獲取響應(yīng)對象
res = urllib.request.urlopen(req)
# 3滥玷、提取響應(yīng)內(nèi)容
html = res.read().decode('utf-8')
print(html)
重構(gòu)UA
也可以通過其他模塊實(shí)現(xiàn),比如requests模塊
8.自定義UA代理池
在編寫爬蟲程序的時(shí)候如贷,一般會(huì)構(gòu)建一個(gè)UA(用戶代理)池杠袱,就是把多個(gè)瀏覽器的UA信息放進(jìn)列表中楣富,再從中隨機(jī)選擇纹蝴,構(gòu)建用戶代理池塘安,能夠避免總是使用一個(gè)UA來訪問王者兼犯,因?yàn)槎虝r(shí)間總是用一個(gè)UA高頻率訪問的網(wǎng)站砸脊,可能會(huì)引起網(wǎng)站的警覺脓规,從而封殺掉IP
構(gòu)建代理池的方法也非常簡單侨舆,在您的pycharm工作目錄中定義一個(gè)ua_info.py文件,將UA信息以列表的形式粘貼到該文件中臭笆,也可以使用專門的第三方模塊來隨機(jī)獲取UA信息愁铺,不過需要安裝
pip install fake-useragent
from fake_useragent import UserAgent
#實(shí)例化一個(gè)對象
ua=UserAgent()
9.URL編碼/解碼詳解
當(dāng)URL或者查詢參數(shù)中茵乱,帶有中文或者特殊字符的時(shí)候,就需要對URL進(jìn)行編碼(采用十六進(jìn)制編碼格式)斤贰,URL的編碼原則是使用安全字符去表示那些不安全字符
注:安全字符荧恍,指的是沒有特殊用途或者特殊意義的字符
URL中規(guī)定了一些具有特殊意義的字符送巡,常用來分隔兩個(gè)不同的URL組件辨嗽,這些字符被稱為保留字符,例如:
- 冒號(hào):用于分隔協(xié)議和主機(jī)組件谷朝,斜杠用于分隔主機(jī)和路徑
- ?:用于分隔路徑和查詢參數(shù)等
- =:用于查詢參數(shù)中的鍵值對
- &:用于分隔查詢的多個(gè)鍵值對
其余常用的保留字符有:/ . ... # @ $ + ; %
10.哪些字符需要編碼
URL之所以需要編碼专钉,是因?yàn)閁RL中的某些字符會(huì)引起歧義跃须,比如URL查詢參數(shù)中包含了&或者%就會(huì)造成服務(wù)器解析錯(cuò)誤菇民;再比如,URL的編碼格式采用的是ASCII碼而非Unicode格式娇掏,這表明URL中不允許包任何非ASCII字符(比如中文)驹碍,否則就會(huì)造成URL解析錯(cuò)誤
URL編碼協(xié)議規(guī)定(RFC3986協(xié)議):URL中只允許使用ASCII字符集可以顯示的字符,比如英文字母嚼酝、數(shù)字浮还、和- _ . ~ ! *這6個(gè)特殊字符,當(dāng)在URL中使用不屬于ASCII字符集的字符時(shí)闽巩,就要使用特殊的符號(hào)對該字符進(jìn)行編碼钧舌,比如空格需要%20來表示
除了無法顯示的字符需要編碼外,還需要對URL中的部分保留字符和不安全字符進(jìn)行編碼涎跨,下面列舉了部分不安全字符:
[ ] < > " " { } | \ ^ * · ‘ ’ 等
下表對URL中部分保留字符和不安全字符進(jìn)行了說明:
字符 | 含義 | 十六進(jìn)制值編碼 |
---|---|---|
+ | URL中+號(hào)表示空格 | %2B |
空格 | URL中空格可以編碼為+號(hào)或者%20 | %20 |
/ | 分隔目錄和子目錄 | %2F |
? | 分隔實(shí)際的URL和參數(shù) | %3F |
% | 指定特殊字符 | %25 |
# | 表示書簽 | %23 |
& | URL中指定的參數(shù)間的分隔符 | %26 |
= | URL中指定參數(shù)的值 | %3D |
11.python實(shí)現(xiàn)編碼與解碼
python的標(biāo)準(zhǔn)庫urllib.parse模塊中提供了用來編碼和解碼的方法,分別是urlcode()與unquote()方法
urlencode():該方法實(shí)現(xiàn)了對url地址的編碼操作
unquote():該方法將編碼后的url地址進(jìn)行還原隅很,也就是解碼
12.爬蟲程序結(jié)構(gòu)
用面向?qū)ο蟮姆椒ň帉懪老x程序時(shí)撞牢,邏輯結(jié)構(gòu)較為固定
#程序結(jié)構(gòu)
class xxxSpider(object):
def __init__(self):
#定義常用的變量,比如url或計(jì)數(shù)變量等
def get_html(self):
#獲取響應(yīng)內(nèi)容的函數(shù),使用隨機(jī)的User-Agent
def parse_html(self):
#使用正則表達(dá)式來解析頁面屋彪,提取數(shù)據(jù)
def write_html(self):
#將提取的數(shù)據(jù)按要求進(jìn)行保存所宰,csv,MYSQL數(shù)據(jù)庫等
def run(self):
#主函數(shù)畜挥,用來控制整體邏輯
if __name__=='__main__':
#程序開始運(yùn)行時(shí)間
spider=xxxSpider()
spider.run()
13.正則表達(dá)式基本語法
正則表達(dá)式是一種字符串匹配模式或者規(guī)則仔粥,它可以用來檢索、替換那些符合規(guī)定的文本躯泰,正則表達(dá)式幾乎適用于所有的編程語言,無論是前端語言javascript還是諸如許多后端語言华糖,比如python斟冕、java、c#等缅阳,這些都提供了相應(yīng)的函數(shù)磕蛇、模塊來支持正則表達(dá)式,比如python的re模塊
在使用python'編寫爬蟲的過程中十办,re模塊通常作為一種解析方法來使用秀撇,通過審查網(wǎng)頁元素來獲取網(wǎng)頁的大體結(jié)構(gòu),然后使用解析模塊來提取你想要的網(wǎng)頁信息向族,最終實(shí)現(xiàn)數(shù)據(jù)的抓取
正則表達(dá)式元字符
元字符 | 匹配內(nèi)容 |
---|---|
. | 匹配除換行符以外的任意字符 |
\w | 匹配所有普通字符(數(shù)字呵燕、字母或下劃線) |
\s | 匹配任意的空白符 |
\d | 匹配所有數(shù)字 |
\n | 匹配一個(gè)換行符 |
\t | 匹配一個(gè)制表符 |
\b | 匹配一個(gè)單詞的結(jié)尾 |
^ | 匹配字符串的開始位置 |
$ | 匹配字符串的結(jié)尾位置 |
\W | 匹配非字母或數(shù)字或下劃線 |
\D | 匹配非數(shù)字 |
\S | 匹配非空白符 |
a|b | 匹配字符a或字符b |
() | 正則表達(dá)式分組所用符號(hào),匹配括號(hào)內(nèi)的表達(dá)式件相,表示一個(gè)組 |
[...] | 匹配字符組中的字符 |
[^...] | 匹配除了字符組中的所有字符 |
量詞
量詞 | 匹配內(nèi)容 |
---|---|
* | 重復(fù)零次或更多次 |
+ | 重復(fù)一次或者更多次 |
? | 重復(fù)0次或者一次 |
{n} | 重復(fù)n次 |
{n再扭,} | 重復(fù)n次或者更多次 |
{n,m} | 重復(fù)n到m次 |
字符組
正則 | 待匹配字符 | 匹配結(jié)果 | 說明 |
---|---|---|---|
[0123456789] | 8 | True | 在一個(gè)字符組里枚舉所有字符夜矗,字符組里的任意一個(gè)字符和"待匹配字符"相同都視為可以匹配泛范。 |
[0123456789] | a | False | 由于字符組中沒有a字符,所以不能匹配 |
[0-9] | 7 | True | 也可以用-表示范圍紊撕,[0-9] 就和 [0123456789] 是一個(gè)意思罢荡。 |
[a-z] | s | True | 匹配所有的小寫字母,直接用 [a-z] 就可以表示 |
[A-Z] | B | True | [A-Z] 就表示所有的大寫字母 |
[0-9a-fA-F] | e | True | 可以匹配數(shù)字对扶,大小寫形式的 a~f区赵,用來驗(yàn)證十六進(jìn)制字符 |
貪婪模式
正則模式默認(rèn)為貪婪匹配,也就是盡可能多的向后匹配字符浪南,比如{n,m}表示前面的內(nèi)容出現(xiàn)n到m次(n小于m)笼才,在貪婪模式下,首先以匹配m次為目標(biāo)络凿,而在非貪婪模式是盡可能少的向后匹配內(nèi)容骡送,也就是說匹配n次即可拜效,貪婪模式轉(zhuǎn)換為非貪婪模式在元字符后添加?即可實(shí)現(xiàn)
14.re模塊用法詳解
re模塊常用方法
re.compile()該方法用來生成正則表達(dá)式對象各谚,其語法格式如下:
regex=re.compile(pattern,flags=0)
參數(shù)說明:
pattern:正則表達(dá)式對象
flags:代表功能標(biāo)志位到千,擴(kuò)展正則表達(dá)式的匹配
re.findall()根據(jù)正則表達(dá)式匹配字符串內(nèi)容
re.findall(pattern昌渤,string,flags=0)
該函數(shù)的返回值是匹配到的內(nèi)容列表憔四,如果正則表達(dá)式有子組膀息,則只能獲取到子組對應(yīng)的內(nèi)容,參數(shù)說明如下:
pattern:正則表達(dá)式對象
string:目標(biāo)字符串
flags:代表功能標(biāo)志位了赵,擴(kuò)展正則表達(dá)式的匹配
regex.findall()該函數(shù)根據(jù)正則表達(dá)式對象匹配目標(biāo)字符串內(nèi)容潜支,其語法格式如下:
regex.findall(string,pos,endpos)
參數(shù)說明:
string 目標(biāo)字符串。
pos 截取目標(biāo)字符串的開始匹配位置柿汛。
endpos 截取目標(biāo)字符串的結(jié)束匹配位置冗酿。
re.split(pattern,string,flag=0)該函數(shù)使用正則表達(dá)式匹配內(nèi)容,切割目標(biāo)字符串络断。返回值是切割后的內(nèi)容列表
re.split(pattern,string,flags = 0)
參數(shù)說明:
pattern:正則表達(dá)式裁替。
string:目標(biāo)字符串。
flags:功能標(biāo)志位,擴(kuò)展正則表達(dá)式的匹配貌笨。
re.sub()該參數(shù)使用一個(gè)字符串替換正則表達(dá)式匹配到的內(nèi)容弱判,返回值是替換后的字符串。其語法格式如下:
re.sub(payyern锥惋,replace昌腰,string,max膀跌,flags=0)
其參數(shù)說明:
pattern:正則表達(dá)式
replace:替換的字符串
string:目標(biāo)字符串
max:最多替換幾處遭商,默認(rèn)替換全部
flags:功能標(biāo)志位,擴(kuò)展正則表達(dá)式的匹配
re.search匹配目標(biāo)字符串第一個(gè)符合的內(nèi)容,返回值為匹配的對象,語法格式如下:
re.search(pattern,string,flags=0)
flags功能標(biāo)志位
功能標(biāo)志位的作用是擴(kuò)展正則表達(dá)的匹配功能捅伤,常用的flag如下所示:
縮寫元字符 | 說明 |
---|---|
A | 元字符只能匹配ASCII碼 |
I | 匹配忽略字母大小寫 |
S | 使得.元字符可以匹配換行符 |
M | 使^$可以匹配每一行的開頭和結(jié)尾位置 |
15.csv模塊(讀寫文件)
csv文件又稱為逗號(hào)分隔值文件株婴,是一種通用的、相對簡單的文件格式暑认,用以存儲(chǔ)表格數(shù)據(jù)困介,包括數(shù)字或者字符。csv是電子表格和數(shù)據(jù)庫中最常見的輸入蘸际、輸出文件格式座哩。
通過爬蟲將數(shù)據(jù)抓取下來,然后吧數(shù)據(jù)保存在文件粮彤,或者數(shù)據(jù)庫中根穷,這個(gè)過程稱為數(shù)據(jù)的持久化存儲(chǔ)姜骡。
csv文件寫入
csv.writer()csv模塊中的writer類可用于讀寫序列化的數(shù)據(jù),其語法格式如下:
writer(csvfile屿良,dialect=‘excel’圈澈,**fmtparams)
參數(shù)說明:
csvfile:必須是支持迭代(iterator)的對象,可以是文件(file)對象或者列表(list)對象
dialect:編碼風(fēng)格尘惧,默認(rèn)為excel康栈,也就是使用逗號(hào)分隔
fmtparam:格式化參數(shù)。用來覆蓋之前dialect對象指定的編碼風(fēng)格
16.csv文件讀取
csv.reader()csv模塊中的reader類和DictReader類用于讀取文件中的數(shù)據(jù)喷橙,其中reader()語法格式如下:
csv.reader(csvfile, dialect='excel', **fmtparams)
17.Pymysql實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)
連接數(shù)據(jù)庫
db=pymysql.connect('localhost','root','123456',maoyandb)
參數(shù)說明:
localhost:本地 MySQL 服務(wù)端地址啥么,也可以是遠(yuǎn)程數(shù)據(jù)庫的 IP 地址。
root:連接數(shù)據(jù)所使用的用戶名贰逾。
password:連接數(shù)據(jù)庫使用的密碼悬荣,本機(jī) MySQL 服務(wù)端密碼“123456”。
db:連接的數(shù)據(jù)庫名稱疙剑。
創(chuàng)建cursor對象
cursor=db.cursor()
執(zhí)行sql命令
execute()方法用來執(zhí)行SQL語句
例:
sql='insert into filmtab values('%s','%s','%s')' % ('刺殺氯迂,小說家','雷佳音'言缤,'2021')
cursor.execute(sql)
sql='insert into filmtab values('%s','%s','%s')'
cursor.execute(sql,['刺殺囚戚,小說家','雷佳音'轧简,'2021'])
提交數(shù)據(jù)
db.commit()
關(guān)閉數(shù)據(jù)庫
cursor.close()
db.close()
插入多條
使用executemany()可以同時(shí)插入多條數(shù)據(jù)
18.爬蟲增量抓取
爬蟲是一種效率很低的程序驰坊,非常消耗計(jì)算機(jī)資源,對于聚焦爬蟲程序而言哮独,需要每天對特定的網(wǎng)站進(jìn)行數(shù)據(jù)抓取拳芙,如果每次都去抓取之前意境抓取過的數(shù)據(jù),就會(huì)白白消耗了時(shí)間和資源皮璧,而增量爬蟲是指通過監(jiān)測網(wǎng)站更新的
那么要如何判斷爬蟲程序是否已經(jīng)抓取過二級頁面的url呢舟扎,其實(shí),當(dāng)你第一次運(yùn)行爬蟲程序時(shí)悴务,爬蟲會(huì)將所有的url抓取下來睹限,然后將這些url放入數(shù)據(jù)庫中,為了提高數(shù)據(jù)庫的查詢效率讯檐,您可以為每一個(gè)url生成專屬的標(biāo)識(shí)羡疗,當(dāng)網(wǎng)站更新后,程序只會(huì)對數(shù)據(jù)庫中不存在的標(biāo)識(shí)進(jìn)行抓取
代碼實(shí)現(xiàn):
建庫建表
create datebase movieskydb charset utf8;
use movieskydb;
create table request_finger(
finger char(60)
)charext=utf8;
create table movieinfo(
moviename varchar(300),
downloadaddr varchar(600)
)charset=utf8;
url標(biāo)識(shí)生成
可以使用python內(nèi)置模塊md5來生成加密標(biāo)識(shí)
#導(dǎo)入模塊
from hashlib import md5
#待加密的url
url="https://www.dytt8.net/html/gndy/dyzz/20210226/61131.html"
# 生成MD5對象
secret = md5()
# 加密url
secret.update(url.encode())
# 提取十六進(jìn)制的加密串
finger = secret.hexdigest()
19.python requests庫安裝與使用
requests庫的宗旨是讓http服務(wù)于人類
requests.get()
該方法用于 GET 請求别洪,表示向網(wǎng)站發(fā)起請求叨恨,獲取頁面響應(yīng)對象。語法如下:
res = requests.get(url,headers=headers,params,timeout)
參數(shù)說明如下:
url:要抓取的 url 地址挖垛。
headers:用于包裝請求頭信息痒钝。
params:請求時(shí)攜帶的查詢字符串參數(shù)秉颗。
timeout:超時(shí)時(shí)間,超過時(shí)間會(huì)拋出異常送矩。
例:
import requests
url = 'http://baidu.com'
response = requests.get(url)
print(response)
requests.post()
該方法用于 POST 請求蚕甥,先由用戶向目標(biāo) url 提交數(shù)據(jù),然后服務(wù)器返回一個(gè) HttpResponse 響應(yīng)對象栋荸,語法如下:
response=requests.post(url,data={請求體的字典})
requests庫常用方法及參數(shù)介紹
requests.request()構(gòu)造一個(gè)請求對象菇怀,該方法是實(shí)現(xiàn)以下各個(gè)方法的基礎(chǔ)
requests.get()獲取html網(wǎng)頁的主要方法
requests.head()獲取html網(wǎng)頁頭信息的方法
requests.post()獲取html網(wǎng)頁post請求方法
requests.put()獲取html網(wǎng)頁put請求方法
requests.patch()獲取html網(wǎng)頁提交局部修改請求
requests.delete()獲取html頁面提交刪除請求
20.SSL認(rèn)證-verifyu參數(shù)
SSL證書是數(shù)字證書的一種,SSL證書遵守SSL協(xié)議蒸其,由信任的數(shù)字證書頒發(fā)機(jī)構(gòu) CA(電子認(rèn)證服務(wù))頒發(fā)。 SSL 具有服務(wù)器身份驗(yàn)證和數(shù)據(jù)傳輸加密功能库快。
verify參數(shù)的作用是檢查SSL認(rèn)證摸袁,默認(rèn)是True,設(shè)置為False則不檢查SSL證書
21.proxies參數(shù)-代理IP
代理ip池
通過構(gòu)建代理ip池可以讓你編寫的爬蟲程序更加穩(wěn)定
requests提供了一個(gè)代理ip參數(shù)proxies义屏,該參數(shù)的語法結(jié)構(gòu)如下
proxies={
'協(xié)議類型(http/https)':'協(xié)議類型://ip地址:端口號(hào)'
}
22.auth參數(shù)-用戶認(rèn)證
requests提供了一個(gè)auth參數(shù)靠汁,該參數(shù)的支持用戶認(rèn)證功能格式如下:
auth=('username','password')
23.Xpath表達(dá)式
Xpath即xml路徑語言,它是一門在xml文檔中查找信息的語言闽铐,Xpath使用路徑表達(dá)式來選取xml/html文檔中的節(jié)點(diǎn)或者節(jié)點(diǎn)集蝶怔,python的第三方解析庫lxml對Xpath路徑表達(dá)式提供了良好的支持,能夠解析xml與html文檔
24.Xpath基本語法
表達(dá)式 | 描述 |
---|---|
node_name | 選取此節(jié)點(diǎn)的所有子節(jié)點(diǎn) |
/ | 絕對路徑匹配兄墅,從根節(jié)點(diǎn)選取 |
// | 相對路徑匹配踢星,從所有節(jié)點(diǎn)中查找當(dāng)前選擇的節(jié)點(diǎn),包括子節(jié)點(diǎn)和后代節(jié)點(diǎn) |
. | 選取當(dāng)前節(jié)點(diǎn) |
.. | 選取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn) |
@ | 選取屬性值隙咸,通過屬性值選取數(shù)據(jù)沐悦。常用元素屬性有@id、@name五督、@type藏否、@class、@title充包、@href |
25.Xpath通配符
通配符 | 描述 |
---|---|
* | 匹配任意元素節(jié)點(diǎn) |
@* | 匹配任意屬性節(jié)點(diǎn) |
node() | 匹配任意類型的節(jié)點(diǎn) |
26.Xpath內(nèi)建函數(shù)
函數(shù)名稱 | xpath表達(dá)式示例 | 示例說明 |
---|---|---|
text() | ./text() | 文本匹配副签,表示值當(dāng)前節(jié)點(diǎn)中的文本內(nèi)容 |
contains() | //div[contains(@id,'stu')]() | 模糊匹配,表示選擇id中包含stu的所有div節(jié)點(diǎn) |
last() | //*[@class='web'][last()] | 位置匹配基矮,表示選擇@class=‘web’的最后一個(gè)節(jié)點(diǎn) |
position() | //*[@class='site'][position()<=2] | 位置匹配淆储,表示選擇@class=‘site’的前兩個(gè)節(jié)點(diǎn) |
start-with() | .//input[start-with(@id,'st)] | 匹配id以st開頭的元素 |
ends-with() | .//input[endswith(@id,'st)] | 匹配id以st結(jié)尾的元素 |
27.lxml
注:不要使用跟庫一樣的命名,會(huì)報(bào)錯(cuò)