国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

用python抓一點數(shù)據(jù)回來

snifes / 1877人閱讀

摘要:背景分析至此,下一步要解決的問題就是完成一次獨立的請求,并解析得到目標數(shù)據(jù)。上方地址欄的網(wǎng)址是請求的入口,中間圓角方框中的格式天津則是請求參數(shù)。當我看到中的天津時,非常開心,因為我找到了請求的入口。

概要

背景描述

網(wǎng)站和http請求分析

IP受限的問題

1. 背景描述

大為軟件公司于2001年9月在保定國家高新技術產業(yè)開發(fā)區(qū)注冊,公司致力于中國、日本知識產權軟件的研究開發(fā),立志成為新興的中國知識產權信息服務業(yè)一流服務供應商,以專業(yè)化、國際化的形象服務于中國市場,為企業(yè)、大學、科研院所、知識產權代理機構等用戶提供國際一流品質的知識產權信息技術服務。

朋友希望獲取A股上市公司(約3000余家)2014-2016年的專利數(shù)量,包括發(fā)明專利/實用新型/外觀專利和外國授權四類。人們使用爬蟲從公開網(wǎng)絡獲取數(shù)據(jù),核心要解決的問題就是效率,通過程序模擬http請求,獲取數(shù)據(jù)并解析得到目標數(shù)據(jù)。3500家公司3年的數(shù)據(jù)累計1萬次請求,初聽來難點在于可能遇到的動態(tài)網(wǎng)頁/網(wǎng)頁解析和其他可能遇到的反爬蟲機制上,但最終卻栽在了1萬次請求上(IP限制)。一般數(shù)據(jù)服務公司出于商業(yè)考量,公共試用服務都會限制請求次數(shù),希望無限制訪問則需要付費升級為vip。

經(jīng)典意義上的爬蟲流程是,定義一個起始網(wǎng)址(start_url),請求該網(wǎng)址并獲取reponse,用lxml或bs4解析網(wǎng)址獲取目標數(shù)據(jù),同時利用網(wǎng)頁之間的外鏈關系將解析得到的url壓棧得到下一步需要爬取的網(wǎng)址,不斷的遞歸上述過程,直到達到約定的條件停止,這種方法時非常暴力的,需要解決url去重和排序的問題,工程量非常大,一般見于淘寶/京東等網(wǎng)站信息的爬取。當目標資源數(shù)量有限,且通過分頁列表的方式組織時,有一種相對優(yōu)雅的方式去組織爬蟲程序,可以通過循環(huán)的方式分別請求目標數(shù)據(jù),很多時候都可以通過直接拼url的方式解決。我面臨的問題有別于經(jīng)典問題,是一個query問題,這一萬次請求之間沒有任何關聯(lián),雖然如此,只要兩個循環(huán)(對股票的循環(huán)和對時間的循環(huán))即可解決。背景分析至此,下一步要解決的問題就是完成一次獨立的請求,并解析得到目標數(shù)據(jù)。

2. 網(wǎng)站和http請求分析

上圖即目標網(wǎng)站截圖,其中右側紅色方框中選中部分的四個數(shù)字就是我的目標。上方地址欄的網(wǎng)址是請求的入口,中間圓角方框中的query格式("天津 and ADY=2016")則是請求參數(shù)。

目前需要解決兩個問題:1,如何將目標網(wǎng)頁load到本地,即將網(wǎng)頁爬下來;2,從爬到的網(wǎng)頁中將目標數(shù)據(jù)解析出來。又以第一個問題最為緊要,且第一個問題還有一個附帶的小問題,即目標網(wǎng)頁是否是動態(tài)網(wǎng)頁。動態(tài)網(wǎng)頁即動態(tài)加載的頁面,一個完整的網(wǎng)絡請求包括load網(wǎng)頁框架和ajax異步請求數(shù)據(jù)并填充渲染。動態(tài)網(wǎng)頁對爬蟲的影響是巨大的,requests或者urllib2等程序發(fā)起的http請求只能完成第一步工作,后續(xù)的ajax異步請求數(shù)據(jù)將不被執(zhí)行,結果是我們將拿不到任何有效信息,一般我們關注的信息都在動態(tài)加載部分,除非我們要的是模版。直覺分析,專利數(shù)據(jù)應該是不斷更新的,這種信息一般的處理方式都是動態(tài)從數(shù)據(jù)庫中檢索獲得,所以極有可能是動態(tài)網(wǎng)頁。動態(tài)網(wǎng)頁的識別和解決辦法按下不表,我們先解決模擬請求的問題。

2.1 模擬請求

經(jīng)典爬蟲是不需要傳參的,我們只需要用requests等包請求目標網(wǎng)址即可,且一般是post方法。我們面臨的問題稍有區(qū)別,需要傳一個query字符串來表明請求的目標。

http協(xié)議中,一般建議通過POST方法的body傳遞參數(shù)給服務端,但是許多網(wǎng)站由于不規(guī)范或者出于安全考慮等原因,通過GET方法方法傳參數(shù)的情況也不鮮見,將query字符串藏在header里面或者拼接在url中都可以實現(xiàn)該目的。

首先,我嘗試了一種最質樸和直接的拼接url的思路,即上圖紅色標注的鏈接,很可惜并未能獲取到檢索結果。to young to naive.

正規(guī)軍的辦法是使用chrome的開發(fā)者工具。如上面截圖,在輸入query字符串之后,我們觀察右側的network目錄,一般在XHR下面會有目標的AJAX請求,我的運氣比較好,目標網(wǎng)站比較簡單,只有一個類似請求,進入請求詳情如下圖。

當我看到request payload中的“天津 and ADY=2016”時,非常開心,因為我找到了請求的入口。general部分標示了目標的網(wǎng)址,且表明這是一個POST請求。如果愿意,我們可以帶上requests header部分,目標網(wǎng)站不需要登陸,所以這一部分處理是否帶上看情懷。

到現(xiàn)在,我們已經(jīng)把網(wǎng)站請求分析清楚了,剩下要做的就是找一個python的包來實現(xiàn)上面的POST請求。

這里一定要吐槽下,作為python的三大主流應用(網(wǎng)站框架/數(shù)據(jù)挖掘/爬蟲)之一,python內置的urllib/urllib2是我見過最混亂和不pythonic的。簡單區(qū)分下,不用scrapy等爬蟲框架的背景下,大家一般會用urllib.urlencode()來拼接帶query的url,然后用urllib2來生成一個Request對象,并用urllib2.urlopen打開該Request,或者直接打開一個url,相關信息參考如下鏈接。

簡單比較了下urllib2和requests之后,我迅速決定使用reuqests包,因為它提供了非常簡潔的post方法,而且接口十分簡潔優(yōu)雅,真心非常對得起它的slogon - http for humans. 這個包也真是沒誰了,logo長得漂亮,api寫的優(yōu)雅,而且也足夠屌,簡介中有一段warning,極盡鄙視其他http包,并威脅如果用其他的包可能導致死亡,吐血拜服。

有一小點需要說明,requests的post方法通過payload參數(shù)傳入body部分,document中說明,同時接受字典和json字符串,我一開始傳入python字典卻總是請求失敗,后來在小象學院楊真老師的提示下,改傳入json字符串方能成功。后期復盤,發(fā)現(xiàn)雖然post能同時接受字典和json字符串,但卻是生成不同的請求body,傳入字典生成的body部分時一個form表單,而傳入json字符串則對應一個字符串。

2.2 解析爬蟲結果

關于動態(tài)網(wǎng)頁的判別,我并沒有直接的判斷,在分析網(wǎng)站的請求的過程中就已經(jīng)知道該請求為動態(tài)加載。對于一般的GET請求,則可以通過urllib2.open(target_url).read()的方法,然后用bs4或者lxml,甚至正則的方法去尋找目標對象, 如果是動態(tài)網(wǎng)頁,則一般找不到或者只能找到空的tag。

解決動態(tài)網(wǎng)頁爬去的思路典型有兩種,一種是模擬瀏覽的行為執(zhí)行完整的請求過程,甚至操作一個瀏覽器完成完整的請求和渲染過程,推薦的組合是Selenium加PhantomJS,其中Selenium提供了操作web server的python api,PhantomJS則是一個headless的瀏覽器。第二種相對輕便的解決辦法就是如我們上述使用,分析網(wǎng)絡請求流程,找出其中請求目標數(shù)據(jù)的AJAX請求的url,并模擬該請求。

解析數(shù)據(jù)部分直接用的resp.json(),不贅述了。

3. IP限制

IP限制幾乎時任何正式爬蟲都會遇到的問題,所以我們也遇到了,還好我們只有一萬次請求,最差也可以人工分一周的時間搞定。

為了解決這個問題,我做了如下的嘗試:

代理IP。GitHub上找到一個項目提供了很優(yōu)美的解決方案。作者寫了一個爬蟲去IP代理池網(wǎng)站爬取代理IP,并用該IP去訪問任意網(wǎng)站(默認是百度,可以考慮用目標網(wǎng)站),如果可以ping通,則將該IP寫入數(shù)據(jù)庫備用。最優(yōu)雅的部分在于,可以用flask等輕量的網(wǎng)站框架寫一個網(wǎng)絡服務,暴露一個get方法來給其他應用使用。可惜的是,該方法爬到的IP在爬取目標網(wǎng)址時非常慢,且大部分不可用,最后這個項目默認的數(shù)據(jù)庫是ssdb,它莫名奇怪的掛掉了。

人肉,他們提到的方案包括插拔家里的路由器,家里和公司的ip每天都刷一遍,找朋友幫忙,騎著單車逛四五個北京的星巴克。

附上項目的github鏈接。

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/45537.html

相關文章

  • 經(jīng)驗拾憶(純手工)=> Linux實工具命令

    摘要:為啥直接不行呢因為以開頭的最后一條命令是。和和和強制終止最常用的,先提出來。。。。我們可以通過這一條命令來迅速回到程序運行的環(huán)境。其實這些配置文件以及這些命令和用戶以及權限等都是有很大關系的。 Ubuntu16升級到18.04 有特殊新穎強迫癥癖好可以升下,如果你覺得16.04好用,就根本沒必要升了 我當時租的 云服務器通常都是16.04,現(xiàn)在估計也是16.04較多 我是個...

    kk_miles 評論0 收藏0
  • python模擬登陸知乎(最新版)

    摘要:原因為啥要寫這一篇文章呢主要是群內有人在模擬登陸知乎,一直不成功然后我抓包看了下,發(fā)現(xiàn)知乎登陸頁已經(jīng)改版了,而且難度大大提高了。 原因 為啥要寫這一篇文章呢? (主要是qq群內有人在模擬登陸知乎,一直不成功)然后我抓包看了下,發(fā)現(xiàn)知乎登陸頁已經(jīng)改版了,而且難度大大提高了。 開始抓包 首先內,還是打開知乎首頁,然后輸入賬號密碼,登陸(記得輸錯密碼) 這樣我們就可以看到請求頭了(請求...

    myshell 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<