1.python 安裝及配置
下載地址
python2 和 python3 共存安裝
2.python 視覺化
import turtle turtle.pensize(2) #畫一個小圓 turtle.circle(10) turtle.circle(40) turtle.circle(80) turtle.circle(160)
工具:
python IDE:pycharm
https://pan.baidu.com/s/1s_bkgDT0QxNTQY07LnQRWQ?pwd=2dlb
提取碼:2dlb
Windows + sublime/VSCode + python
Linux + vim/sublime + ipython
pip 官網:https://pypi.org/project/pip/(python 2.7.9 + 或 python 3.4 + 以上版本自帶)
3.python 網頁爬蟲
3.1.爬蟲思想
爬蟲:資料皆可取
Linux:一切皆檔案
python:一切皆物件
LaTex:所想即所得
Office:所見即所得
爬蟲會造成短時間內伺服器吞吐量過大,CPU 升高,負載過重,影響正常使用者的訪問;出於對資料保護,網站所有者會設定驗證碼、滑動視窗等需要人為互動的操作來保證訪問確保不是爬蟲程式,因此爬蟲需要考慮到規劃、負載
通常網站所有者會在網站根路徑下放置一個 robots.txt 檔案,該檔案定義了一套協議規定網路爬蟲器不應該爬取或允許爬取那些區域
3.2.HTTP 請求協議
最基本的 HTTP 請求方法:GET、POST、PUT、DELETE
3.3.常用 python 庫
1.urllib/urllib2/urllib3:https://docs.python.org/zh-cn/3/library/urllib.html(自帶)
urllib 是一個收集了多個涉及 URL 的模組的包,包含開啟、讀取、解析URL、解析 robots.txt 檔案、異常處理等功能
python3 中也有 urllib 和 urllib3 兩個庫,urllib 幾乎是 python2.7 中 urllib 和urllib2 兩個模組的集合,所以常用 urllib 模組,而 urllib3 則作為一個擴充模組使用。python2.7 中的 urllib2 相當於 python3 中的 urllib.request。
通常 python2.7 中的 urllib2 在移植到 python3 中時可疑改寫成:import urllib.request as urllib2
2.requests:https://requests.readthedocs.io/zh_CN/latest(pip install requests)
該模組允許傳送 HTTP/1.1 請求
3.beautiful soup:https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/#(pip install beautifulsoup4)
該模組可以從 HTML 或 XML 檔案中提取資料,能夠透過你喜歡的轉換器實現慣用的文件導航,查詢,修改文件的方式。
3.4.案例1-爬取圖片
#coding:utf-8 from requests import * from re import * """ coding:utf-8:指定編碼格式 爬取多肉圖片並儲存在本地 """ for i in range(5): #獲取站點原始碼 a=get('https://www.duitang.com/blog/?id=14188000%d'%(i+47)) """ .:匹配一個 +:後面所有的都能匹配上 ?:最小化匹配(能匹配多少就匹配多少) .+?:能匹配所有的東西 找對應的圖片原始碼,限制找原始碼中只能有多肉圖片那一行程式碼: <img alt=".+?" id="mbpho-img" class="js-favorite-blogimg" src="https 保證能夠精準匹配 src="(https.+?)":這裡加括號表示只需要括號這部分內容 若沒有後面的style匹配,那麼返回的結果就會從https開始後面的所有字元,包括stype中的內容 """ reg=compile(r'<img alt=".+?" id="mbpho-img" class="js-favorite-blogimg" src="(https.+?)" style=".+?" />') #輸出找到的圖片地址,findall:查詢所有跟上述程式碼一樣的內容 #print(findall(reg,a.text)) ,text:會對內容進行轉碼操作 datas=findall(reg,a.text) #請求剛才匹配到的資料,content:獲取原始碼 img=get(datas[0]).content #將請求到的圖片儲存到本地 /img 下 f=open('./img/%d.jpg'%(i),'wb') f.write(img) f.close()
3.5.requests 庫的使用
import requests """ requests 庫的使用 """ r= requests.get( 'https://github.com/timeline.json', headers = dict, #頭資訊 params = dict, #Url引數params data = dict, #傳送表單post proxies = dict, #代理 cookies = dict, #新增cookie資訊 timeout = int #設定超時事件 ); r.txt #獲取原始碼 r.status_code #獲取狀態碼
3.6.正規表示式
\:轉義
^:匹配首字串
$:匹配尾字串
*:匹配前面子表示式零次或多次
+:匹配前面子表示式一次或多次
?:匹配前面子表示式零次或一次
{n}:匹配 n 次。如:o{2} 不能匹配 bob 中的 o,但能匹配 food 中的兩個 o
{n,}:至少匹配 n 次。如:o{2} 不能匹配 bob 中的 o,但能匹配 fooood 中的所有 o
{n,m}:其中 n<=m,最少匹配 n 次且最多匹配 m 次
?:非貪心量化(Non-greedy quantifiers):當該字元緊跟在任何一個其他重複修飾符(*,+,?,{},{n,},{n,},{n,m})後面時,匹配模式是非貪婪的。
非貪婪模式儘可能少的匹配所搜尋的字串,而預設的貪婪模式則儘可能多的匹配所搜尋的字串。例如,對於字串 oooo,o+? 將匹配單個 o,而 o+ 將匹配所有 o。
.:匹配除 \n 之外的任何單個字元。要匹配包括 \n 在內的任何字元,要使用像 (.|\n) 的模式
(pattern):匹配 pattern 並獲取這一匹配的子字串。
[^xyz]:排除型字符集合。匹配未列出的任意字元
[a-z]:字元範圍。匹配指定範圍內的任意字元
[^a-z]:匹配任何不再指定範圍內的任意字元
\b:匹配一個單詞邊界,也就是指單詞和空格間的位置。如,er\b 可以匹配 never 中的 er,但不能匹配 verb 中的 er。
\B:匹配非單詞邊界。如,er\B 可以匹配 verb 中的 er,但不能匹配 never 中的 er。
\cx:匹配由 x 指明的控制字元。如,\cM 匹配一個 Control-M 或回車符。x 的值必須為 A-Z 或 a-z之間,否則將 c 視為一個原義的 c 字元。
\d:匹配一個數字字元。注意,Unicode 正規表示式會匹配全形數字字元。
\D:匹配一個非數字字元。
\f:匹配一個換頁符。等價於 \x0c 和 \cL
\n:匹配一個換行符。等價於 \x0a 和 \cJ
\r:匹配一個回車符。等價於 \x0d 和 \cM
\s:匹配任何空白字元,包括 空格、製表符、換頁符。等價於 [\f\n\r\t\v]。注意 unicode 正規表示式會匹配全形空格符
\S:匹配任何非空白字元。
\t:匹配一個製表符。等價於 \x09 和 \cl
\v:匹配一個垂直製表符。等價於 \x0b 和 \cK
\w:匹配包括下劃線的任何單詞字元。等價於 [A-Za-z0-9]。注意 unicode 正規表示式會匹配中文字元
\W:匹配任何非單詞字元。
\ck:匹配控制跳脫字元。k 代表一個字元。等價於 Ctrl-K
正則優先順序
最高:\
高:()、(?:)、(?=)、[]
中:*、+、?、{n}、{n,}、{n,m}
低:^、$、中介字元
次最低:串接(即相鄰字元連線在一起)
最低:|
3.7.反爬技巧與繞過手段
3.7.1.header 檢測與繞過
1.常用 header 頭
Accept:指定客戶端能夠接收的內容型別。如,Accept: text/plain, text/html
Accept-Charset:瀏覽器可以接受的字元編碼集。如,Accept-Charset: iso-8859-5
Accept-Encoding:指定瀏覽器可以支援的 web 伺服器返回內容壓縮編碼型別。如,Accept-Encoding: compress, gzip
Accept-Language:瀏覽器可接受的語言。如,Accept-Language: en,zh
Connection:表示是否需要持久連線(HTTP 1.1 預設進行持久連線)。如,Connection: close
Content-Length:請求的內容長度。如,Content-Length: 348
Content-Type:請求的實體對應的 MIME 資訊。如,Content-Type: application/x-www-form-urlencoded
Referer:從什麼地方來。如:Referer: http://www.zcmhi.com/archives/71.html
2.無 header
#coding:utf-8 from requests import * from re import * url = 'https://www.zhihu.com/' r=get(url).text print(r) 執行結果可能是 400
3.加 header 繞過
#coding:utf-8 from requests import * from re import * url = 'https://www.zhihu.com/' header={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36'} r=get(url,headers=header).text print(r)
獲取正常資料
3.7.2.cookie 加密
#coding:utf-8 from requests import * from re import * url = 'http://192.168.1.5/a.php/'cookie={'PHPSESSID':'xxxx'}
data={'token':'xxx','type':'7'} r=post(url,cookies=cookie,data=data).text print(r)
3.7.3.驗證碼
1.使用驗證碼介面
2.編寫驗證碼識別庫
3.7.4.ban IP
換代理