用python想爬蟲卻出現反爬蟲的網站

2,046 views
Skip to first unread message

羅泰集

unread,
Feb 10, 2015, 9:38:27 AM2/10/15
to pyth...@googlegroups.com

各位版友好 我是高科大的teddy,我正在用python撰寫一隻程式,並且以cc py為練習目標人,想爬蟲抓取他的follower以利後續的挖掘,可是這網站有做反爬蟲的處理,抓下來都是圖片,不知該怎麼辦?

 

網頁原始碼如下,想抓他的第一個人Fabien Cadet人名

……………………………………………………………………………………………………………………………..

<div id="column">

<div id="leftColumn">

<div id="followItems">

<table>

<tr>

<td>

<div class="icon">

<a class="avatarPopup" title="Fabien Cadet" href="/profile/fabicxx" ><img alt="Fabien Cadet" src="https://resources.diigo.com/images/avatar/user/fabicxx_96.jpg"/></a><!--avatar-->

</div>

<div class="desc"><a href="/profile/fabicxx">Fabien Cadet</a></div>

</td>

…………………………………………………………………………………………………………………

我的程式碼是

…………………………………………………………………………………………………………………

import requests

import re

from BeautifulSoup import BeautifulSoup

import HTMLParser

 

user1 = 'U9824722'

res = requests.get("https://www.diigo.com/friends/follower/"+user1)

soup = BeautifulSoup(res.text.encode("utf=8"))

 

tid_table = soup.findAll('div',{'class':'column'})

 

print

for each2 in tid_table:

    print(each2)

………………………………………………………………………………………….

結果執行後沒反應,請各位給些意見,幫幫我,謝謝。

knot

unread,
Feb 11, 2015, 9:38:06 AM2/11/15
to pyth...@googlegroups.com
import urllib
from bs4 import BeautifulSoup

user1 = 'U9824722'
ra = urllib.request.urlopen("https://www.diigo.com/friends/follower/"+user1)
content = ra.read()    
    
print(content)    


以上是python3

真的碰到反爬蟲
我記得要
1 設header 模擬真人訪問
2 每次存取要有一定的間隔時間
3 用多個proxy輪流存取

這個網站就有反爬蟲, 還會擋IP,要用多個proxy才能騙過它






teddy lo於 2015年2月10日星期二 UTC+8下午10時38分27秒寫道:

CHEN POLO

unread,
Feb 11, 2015, 11:15:28 PM2/11/15
to pyth...@googlegroups.com
Hi, 學弟

他其實沒有真正的擋爬蟲喔,只是因為它的follower是用Ajax載入的,所以scrapy無法直接處理。

建議你可以用selenium 在特定的網 址用瀏 覽器戴入,然後再把page的html傳給beautifulsoup做處理。

希望有幫 到你的忙


--
這是 Google 網上論壇針對「python.tw」群組發送的訂閱通知郵件。
如要取消訂閱這個群組並停止接收來自這個群組的郵件,請傳送電子郵件到 pythontw+u...@googlegroups.com
如要在這個群組張貼留言,請傳送電子郵件到 pyth...@googlegroups.com
請前往以下網址造訪這個群組:http://groups.google.com/group/pythontw
如需更多選項,請前往:https://groups.google.com/d/optout

He-chien Tsai

unread,
Feb 12, 2015, 12:25:00 AM2/12/15
to pyth...@googlegroups.com
那叫動態網頁, ajax啥麼的, 網頁會依照用戶互動自行改變, 你沒互動就沒東西會出現, Python是可以觸發javascript的, 但建議是打開HTML觀察一下javascript是哪一段網址在作AJAX請求的, 就直接用那段網址抓下json(或XML)就好, 不用整個網站抓下來

selenium那個不太好, 因為那是給人測試自己的網站用的, 拿那個掃人家網站實在是..., 對自己來說也是比較吃資源, 掃大量損人害己, 要是大家都這麼搞, 到時候對方就真的只好裝個反爬蟲

teddy lo於 2015年2月10日星期二 UTC+8下午10時38分27秒寫道:

He-chien Tsai

unread,
Feb 12, 2015, 12:41:55 AM2/12/15
to pyth...@googlegroups.com
補充一下Proxy那邊
找Proxy多數人會優先想找免費的, 但免費的通常要跟人搶頻寬, 還可能會有流量限制, 掃到一半proxy突然把連線打掉也很阿雜
還有些proxy素行不良亂加東西, 輕則亂加廣告和重則代碼注射, 有些付費的也不一定會比較安全@@
用vps比較保險, 最近的vps都以小時計費, 租幾小時花不到幾毛錢, 而且還可以事先建映像檔儲存, 往後一鍵就能弄好預先設定的主機.
可以在上面建個proxy映像檔, 以後有用到就可以直接上了

knot於 2015年2月11日星期三 UTC+8下午10時38分06秒寫道:

CHEN POLO

unread,
Feb 12, 2015, 1:55:23 AM2/12/15
to pyth...@googlegroups.com
整個網頁的類型是叫動態網頁沒錯,但做的動作的確是載入AJAX,所以問題點在於?

Python要怎樣觸發Javascript  可以詳細說明一下嗎?要跟DOM做互動不需要瀏覽器核心嗎?
我覺得至多就是把它 載回來做分析。

至於SELENIUM是相對其他方法比較方便而已,這我沒啥意見啦
爬人家東西本來就是不好的,用什麼方法我是覺得都沒差啦,
你要不要在PO一篇論述讓我聽聽你的高見?

至於用VPS架的PROXY 要怎樣換不重複的IP啊?
可以說的更詳細點嗎?

--

CHEN POLO

unread,
Feb 12, 2015, 2:00:55 AM2/12/15
to pyth...@googlegroups.com
更正  是用AJAX做部分載入的動作

knot

unread,
Feb 12, 2015, 3:35:05 AM2/12/15
to pyth...@googlegroups.com

proxy 的部份我是直接從數十個proxylist中
以10個線程同時pin出去,並計算該proxy的平均timeout跟成功率
只要在標準以下就濾掉,亂加碼的也濾掉,最後剩下幾十個可以用的
所以只要proxy夠多是可以減低頻寬被搶的問題
雖然麻煩了一點,但還挺好玩的!

這樣的作法其目的跟花錢的VPN有點不同
因為是免費的,所以它的使用情境是讓使用者隋時想到就上去抓
如果需要付費,依人的天性大概就會想一次把整個站抓下來


He-chien Tsai於 2015年2月12日星期四 UTC+8下午1時41分55秒寫道:

knot

unread,
Feb 12, 2015, 3:58:31 AM2/12/15
to pyth...@googlegroups.com

除了把html抓回來分析以外
可以找出ajax response 到browser的 json 檔
直接分析json可能會比較快

比如像這個站

ajax get 的URL 可以在chrome 按ctrl+shift+j 把console打開, 切到Network tab ->打開XHR -〉重新刷新頁面
你會看到AJAX GET方法中的URL

直接存取AJAX的url來分析會比html方便多了

-----------------------------------------------------------------------

關於python 觸發javascript 應該是指nodejs 吧
如果是純javascript就要透過jsonRPC xmlRPC 或protobuf 不過也要對方server有開啟這樣的服務才行

不過也有可能我是錯的!




CHEN POLO於 2015年2月12日星期四 UTC+8下午2時55分23秒寫道:

He-chien Tsai

unread,
Feb 13, 2015, 6:47:55 AM2/13/15
to pyth...@googlegroups.com
後面那句才是我想提的方法, 直接觀察html裡面javascript的ajax網址, 抓ajax來源網址就好
至於js可以在Python觸發這部分, 只是順道補充下樓主, 並不是沒辦法觸發, 所以就沒說完了
你說的Selenium就可以觸發js @@
另外這個也是能觸發js的https://pypi.python.org/pypi/spynner

每一家vps都會在全球有好幾個地點, 像linode有東京、倫敦、美東美西等, 還可以另外再找別家vps來補充, 在digitalocean也租十個這樣, 混合起來這樣請求看起來就更不像同一個人
這兩家vps都是有API的, 所以出租和停租還有其他各種選項等, 全都可以從Python去控制
https://www.linode.com/api
https://developers.digitalocean.com/
所以是可以寫個程式, 自動在不同隨機地點租個一百台, 抓完後程式再把主機都自動停租(最好寫個迴圈一直停租, 直到有對方有回覆停租確定的回應, 不然就一直燒錢)
租好後在Python裡弄個List存主機列表, 每次請求都隨機抽取一台主機, 看起來就像不一樣的人了
反而是proxy都沒有API的, 還得手動切來切去很麻煩 @@

CHEN POLO於 2015年2月12日星期四 UTC+8下午2時55分23秒寫道:

teddy lo

unread,
Feb 13, 2015, 7:42:46 AM2/13/15
to pyth...@googlegroups.com
你是學長嗎!? 真的很謝謝你的解答

CHEN POLO於 2015年2月12日星期四 UTC+8下午12時15分28秒寫道:

knot

unread,
Feb 14, 2015, 1:13:20 AM2/14/15
to pyth...@googlegroups.com
python urllib proxyhandler
用法也是一樣把proxylist 寫在迴圈裡, 用threading 實作async讓他一直跑

pip = register( )['proxy'] #proxy address
url = register( )['url']
timeout = self.timeout

if self.use_proxy:
proxy_handler = urllib2.ProxyHandler( { 'http': pip } )
opener = urllib2.build_opener( proxy_handler )
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
urllib2.install_opener( opener )
req = urllib2.Request( url
)


python裡可用threading或multiproccessing 實作async
這二種方法不同在於

threading example
想自已實作的人可以玩玩看

比較不麻煩的方法用grequests/ requests





He-chien Tsai於 2015年2月13日星期五 UTC+8下午7時47分55秒寫道:
Reply all
Reply to author
Forward
0 new messages