從0到1的網頁爬蟲 - 07

Pyladies Taiwan

Speaker : Mars

2017/04

Roadmap

  • multi-processing
  • 爬蟲經驗分享
  • The End?

multi-processing

In [1]:
import requests
from multiprocessing import Process,Queue
_WORKER_PROCESS_NUM = 5

_url = "http://axe-level-1.herokuapp.com/lv2/?page={}"
def get_page(page_num):
    resp = requests.get(_url.format(page_num))
    fileout = open ("{}.html".format(page_num),'w')
    fileout.write(resp.text)
    fileout.close()

def worker(queue):
    while not queue.empty():    
        page_num = queue.get()
        get_page(page_num)

def main():      
    # Multi-processing
    queue = Queue()
    for i in range(1,12+1):
        queue.put(i)

    process=[]
    for i in range(_WORKER_PROCESS_NUM):
        p = Process(target=worker,args=(queue,))
        p.daemon=True
        p.start()
        process.append(p)

    for i in process:
        i.join()
In [2]:
# 開了multi-processing
import time
t_start = time.time()
main()
t_stop = time.time()
print (t_stop - t_start)
1.0364434719085693
In [3]:
# serial
import time 
t_start = time.time()
for i in range(1,12+1):
    get_page(i)
t_stop = time.time()
print (t_stop - t_start)
3.6738579273223877

爬蟲經驗分享

Crawler

重點:Chrome 的 「開發人員工具」觀察Network

網頁內容是純html,還是靠JS產生?

=> 透過瀏覽器>檢視原始碼、Quick Javascript Switcher
若確定是JS產生,觀察Network,找出能拿到資料的網址

特殊經驗

  • 可點選的圖片前往的連結,並不是寫在原始碼中,而是看你點選的圖片位置,若正確點選到,才會連到另一個網頁
    => 看POST丟哪些資料,一個個加入,看哪些是必要參數,同時觀察其他類似狀況,看哪幾個參數有變動。

Crawler

網頁是否有檔爬蟲

  • Header
    => 先從User-Agent、Content-Type試試,一個個加入,看哪些是必要參數。

    Cookies也可以先用瀏覽器的加,就可以不用以selenium+PhantomJS去模擬。

  • 驗證碼
    => 看POST丟哪些資料,先寫程式丟假的驗證碼過去。

    能不用selenium+PhantomJS就不要用(太慢、又耗資源,但好處是可以快速驗證)

  • IP
    => 浮動IP、VPS、proxy、tor洋蔥路由器

Parser

主要以lxml,搭配XPath可以做很詳細的語法選擇。
遇到真的很棘手的,會搭配正規語法re,或直接把整區的純文字存下來,再以split去切。

從0到1的網頁爬蟲 - 02

  • 不只by id,class,任何屬性皆可
  • 可以以小孩定位,找家長

能不要以位於第幾個位置就不要用

  • //*[@id="PaymentContainer"]/div[2]/ul/li[1]/span/span
  • //div[@id="PaymentContainer"]//span[@class='price']/span[@class='value' and not(@id)]

DB

觀察對方架構,思考哪些是我們需要的資料,規劃資料儲存架構。

SQLite
SQLite & Python

The End?