爬蟲(抓取靜態頁面和動態頁面的區別,get請求和post請求的區別)
靜態頁面:
非結構化資料:HTML
處理方式:正則表示式,xpath, beautifulsoup4
靜態頁面中的資料都包含在網頁的HTML中(一般都是get請求)
所以可以直接在網頁的HTML中提取資料
關鍵詞一般都以查詢字串的方式拼接在URL中
分析URL的變化可以進行多頁爬取
python2: urllib + urllib2 / requests
# coding=utf-8 import urllib2 import urllib headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"} key_word = raw_input("請輸入想要爬取的貼吧名字:") page = int(input("請輸入需要爬取的頁數:")) base_url = 'https://tieba.baidu.com/f?' for i in range(0,page): params = { 'kw':key_word, 'pn':(i)*50, } url = base_url + urllib.urlencode(params) print(url) request = urllib2.Request(url,headers=headers) response = urllib2.urlopen(request) html = response.read() with open(key_word + '.txt','a') as f: f.write(html) print'第%d頁'%(i+1) print '資料抓取完畢'
這樣可以獲取貼吧的靜態頁面的HTML
python3: urllib + urllib.request / requests
頁面提取技術:
1.re(正則)
1>主要方法有:search(返回字串),match(返回字串),findall(返回列表),sub(返回字串)
2>正則前加上r表示按原生字串進行匹配,特殊符號不需要轉義
3>匹配是注意貪婪和非貪婪模式
4>可以先建立一個pattern = re.compile(r''),可以不必每次正則匹配時重新建立pattern,可以節省記憶體空間
2.xpath和lxml
1>xpath基於HTML的樹結構和節點進行取值
2>匹配方式
3>lxml的使用方法
html = etree.HTML(text)
ret_list = html.xpath("xpath字串")
3.beautifulsoup4
1>基本使用
soup = BeautifulSoup(html, "lxml") node_list = soup.select(".even, .odd")
2>bs4是基於css選擇器的,選擇class,id,層級選擇器方式都和CSS語法相同
3>主要有select(), find(), findall()三個方法,select,findall返回列表,find返回當個物件
4>獲取文字內容:get_text() 或string
獲取屬性值: get('屬性名') 或attrs['屬性名']
動態頁面
結構化資料:json,xml等
處理方式:直接轉化為python型別
動態頁面和靜態頁面最主要的區別就是當資料重新整理的時候用了ajax技術,重新整理時從資料庫查詢資料並重新渲染到前端頁面
資料都儲存在json中,爬取HTML是獲取不到資料的
json資料提取技術(jsonpath)
1.動態頁面都需要動態抓包來獲取response中的json資料
2.重新整理頁面,開啟開發者模式,點選Network,在點選XHR,找到獲取json資料的URL
3.json有4個方法(json.loads(), json.dumps())括號中接收字串 (json.load(), json.dumps())括號中接收的是檔案
loads: 將json資料轉換成python資料 dumps: 將python資料轉化成json資料
4.jsonpath的語法與xpath的語法很相似
$: 根節點 . : 下一級節點 通常用法: $..節點名
5.jsonpath中接收的引數必須是python型別的
例如: result_list = jsonpath(python_dict,"$..result")
6.可以在傳送請求時使用.json()的方法獲取python資料
GET請求和POST請求的區別?
GET請求中的URL可以包含查詢字串,請求響應的請求體中中一定不能包含表單資料
POST請求中的URL可以包含查詢字串,請求響應的請求體中一定包含表單資料(不包含表單資料也不會報錯,那樣就直接使用GET請求了)