一個簡便方法是使用 site:example.com 查詢,然而這種方法對於大戰不適用css
builtwith 模塊
pip install builtwith
builtwith.parse(url) # returns a dictpython
python-whois 模塊
pip install python-whois
import whois
whois.whois(url)json
下載器須要提供的幾個功能:瀏覽器
例子:https://bitbucket.org/wswp/code/src/chpter01/link_crawler3.py緩存
下載的第二步,就是把得到的網頁傳遞給 Extractor 來提取內容,能夠經過傳遞給下載函數回調來處理,可是這種耦合性太強了cookie
書中的緩存把全部相應都作了緩存,包括500的錯誤響應,實際上這樣的直接不緩存好了。。
書中的磁盤緩存把 url normalize 邏輯也加到了這裏,感受比較混亂
注意使用磁盤文件緩存的話會受限於磁盤單目錄文件的數量,即便是 ext4 文件系統也不大多線程
執行下載時間估算也是很重要的,每一個連接下載須要多長時間,整個過程須要多長時間
多線程的下載例子,手工模擬線程池併發
def process_queue(q): pass threads = [] while thread or crawl_queue: for thread in threads: if not threads.is_alive(): threads.remove(thread) while len(threads) < max_threads and crawl_queue: thread = threading.Thread(target=process_queue, daemon=True) thread.start() threads.append(thread) time.sleep(some_time)
性能的增加與線程和進程的數量並非成線性比例的,而是對數比例,由於切換要花費必定的時間,再者最終是受限於帶寬的app
依賴於 Ajax 的網站看起來更復雜,可是實際上由於數據和表現層的分離會更簡單,可是若是逆向工程也很差獲得通用的方法,如何構建一個輔助工具呢?
表示出網頁上哪些地方是動態加載的,列出 js 全局變量,列出可能的 jsonp 請求函數
利用 Ajax 接口時,能夠利用各類邊界狀況,好比把搜索條件置爲空,置爲 *,置爲 .
使用Qt
使用 Selenium 或者 PhantomJS,這時附加 Cookie 等都是很嚴重的問題
登陸表單中每每會有隱藏的參數,好比 form_key 用於避免表單重複提交,還可能須要 cookie 驗證
Wow,居然能夠直接從瀏覽器加載 Cookie,使用 browsercookie 模塊
使用機器識別驗證碼
使用 Pillow 和 pytesseract 識別驗證碼,可是 tessact 本不是用來識別驗證碼的
一種銳化方法
img.convert('L') img.point(lambda x: 0 if x < 1 else 255, 'l') tessact.image_to_string(img)
還能夠經過限定字符集提升識別率
還可使用人工打碼平臺