關於爬數據的一點點事情


由於項目需要,最近需要從網上爬數據,也因此對爬數據這一塊進行了一些了解。

關於爬蟲,主要說說在實驗過程中幾個重要的點

1.偽裝瀏覽器訪問

一開始沒注意這個問題,導致多次訪問不是很順暢,有時候需要等待好久。作為一個純真的小男孩,初始代碼非常簡單,就像下面這樣直接建立連接,然后獲得對應url的內容。

s = requests.Session()
connection = s.get(url)

后來,發現了上面所說的問題后,上網相關搜索了一下,對原有“純真”的代碼進行了改造,加了瀏覽器的一些元素,讓代碼在外部看起來更像人為正常的瀏覽器訪問,而不是一個爬蟲。具體改造如下

s = requests.Session()
connection = s.get(url, headers={
                    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"
                })

也就是加了headers中user-agent這個元素而已。具體user-agent可以從瀏覽器中的任意網頁-->右鍵(檢查)-->Network-->刷新-->選中一個js文件(中可以查看對應的request header),然后復制過來即可。

2.恰到好處的sleep和timeout

time.sleep()

這里的sleep函數是個好東西,因為當爬蟲一直爬取人家數據的時候,稍微正常點的網站都會有一些防護的措施,當你被識別為爬蟲等不明外來攻擊者時,網站會攔截你的訪問,這樣你爬數據的目的就呵呵噠了。這時候就需要你每次訪問之后有個適當的休息時間,因為人為訪問最快也得有個頻率的嘛,我們的目的就是要偽裝成人為瀏覽器訪問的樣子。我本次實驗的處理方法是在每次下載操作完成之后sleep一秒,這樣的頻率剛剛好滿足網站的攔截頻率。

try:
    connection = s.get(url, headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"
                }, timeout = 5)
except Exception, e:
    print "downloading for more than 5s, so try again now..."
    continue

上面是加了timeout的爬取訪問,這里為啥要加timeout呢,在實驗過程中我發現目標網址在你一連串的訪問之后有時會卡住(具體原因我倒沒有細究過,也可能是網速問題卡住了吧)然后我們的實驗程序就停止了,這時其實我們重新嘗試連接時很快就可以訪問下載的,所以這里很可能只是我們的程序卡住了而已,解決這一點我采用的是在訪問目標網址的時候設置了一個timeout參數,讓程序若在5秒之內未連接成功,自動嘗試重新連接。

3.IP代理訪問

當你使用sleep之后,你會發現下載還是比較順暢的,成千上萬的數據量隨隨便便就是時間的問題了。但是當你面臨着幾百幾千萬甚至上億數據量要下載的時候,你就會覺得這要下到何年何月啊,要是有多幾台服務器給我跑那該多好。這時候IP代理就應該出現了。所謂IP代理在這里的用處,我的理解是相當於我們把訪問請求發給代理,代理再幫我們轉發到我們的目標網址這樣一來,訪問目標網址的就是IP代理,而不是我們自己的IP。是不是看出有什么可以拓展的了?也就是說我們只要擁有多個穩定的IP代理,就可以相當於擁有很多個主機的樣子,多台主機同時爬取數據,這速度比原先的就要快上個很多很多倍了(雖然我這次只是用多台主機在跑而已)。具體操作如下

PROXY = {'http':'http://120.77.255.133:8088'}
...
connection = s.get(url, headers={
                    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"
                }, proxies=PROXY, timeout = 5)

(至於IP代理如何獲取,網上教程也挺多的,我之后也會寫一篇關於這個問題的博客)

 

自己第一次寫爬蟲,探索探索,覺得爬蟲好像也挺有意思的,就這樣讓一個程序代替了機械化的人為操作,還是有點成就感的。

 

以上也只是本次實驗的一些心得體會,肯定有很多不足的地方,如各位大大看到哪里寫錯了,請一定指正告知,謝謝各位了~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM