1. 程式人生 > >爬蟲(抓取靜態頁面和動態頁面的區別,get請求和post請求的區別)

爬蟲(抓取靜態頁面和動態頁面的區別,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請求了)