Python登陸小米路由器撥號(hào)更換IP,繞過網(wǎng)站反爬IP限制機(jī)制
圖/文:迷神
最近無聊去爬某眼查的企業(yè)數(shù)據(jù)信息,我已經(jīng)通過其他方式,把企業(yè)數(shù)據(jù)按照分類和某眼查的屬于存到表里面,只要通過某眼查的url地址爬取內(nèi)容詳細(xì)頁所需要的數(shù)據(jù)就可以了。但是呢,某眼查作為國內(nèi)專門抓別人的數(shù)據(jù)的站,基本上各種反扒機(jī)制都有。比如這某眼查如果未登錄用戶,只能爬100條,超過,立馬要求登陸。
有人可能說,怎么不用代理,答案是可以的,但是免費(fèi)代理,網(wǎng)上一堆免費(fèi),但是我實(shí)際爬過N多站,基本上100個(gè),能有5個(gè)就不錯(cuò)了。大部分都很假,當(dāng)然土豪也可以去付費(fèi)去買,然后驗(yàn)證下去買,但是,我們這里借助我們家庭wifi撥號(hào)上網(wǎng)模式,只要被限制,立馬通過python斷網(wǎng),然后重連,進(jìn)行更換IP。
Python+小米miwifi路由:
1、獲取路由撥號(hào)地址
小米路由界面,這里是撥號(hào)上網(wǎng),切換IP
大家可以手動(dòng)登錄下小米路由器(你如果用python等會(huì)獲取結(jié)果一樣的,因?yàn)檫@個(gè)本地miwifi。com是指向服務(wù)器的,可以保持長時(shí)間在線的,沒必要反復(fù)登錄,我就不模擬登陸了,都是很easy的事情),可以看到這個(gè)撥號(hào)聯(lián)網(wǎng),是2個(gè)開始和暫停js事件,我們只要訪問這個(gè)地址,即可實(shí)現(xiàn),路由進(jìn)行撥號(hào)上網(wǎng),即可:
這里我們用到3個(gè)類庫,先安裝下:
pip install pyquery #用于解析某眼查的頁面的,非常強(qiáng)大的一個(gè)html解析庫,有空可以講講
pip install requests #頁面請(qǐng)求。
pip install retrying #python異常重試類庫
爬蟲切換路由IP整體思路
1、就是通過數(shù)據(jù)庫,獲取某眼查url地址,然后開始爬數(shù)據(jù),如果爬取不到想要到的內(nèi)容,則是被攔截了。
res = mydb.select('url', cond_dict = {'name':'0'},fields=["id", "url"],order="order by id asc limit 1")
id = res[0][0]
url = res[0][1]
print(url)
r = s.get(url,headers=headers, timeout=5)
html = r.text
d = PyQuery(html)
name = d.find('h1.name').text()
if not name:
if html.find('>抱歉,該信息暫不予顯示,查一查其它信息<') != -1:
name = '企業(yè)異常,不予以展示'
else:
name = ''
print(str(i)+":"+name)
url2 = d.find('a.company-link').text()
print(url2)
if len(name) == 0:
print('被攔截了'+str(i))
else:
update_params = {"name": name,"wz":url2} # 需要更新為什么值
update_cond_dict = {"id": str(id)} # 更新執(zhí)行的查詢條件
mydb.update('url', update_params, update_cond_dict)
2、調(diào)用小米路由器的接口,進(jìn)行撥號(hào)更換,一屏蔽IP,就立馬更換IP。
print('開始斷網(wǎng)切換IP')
r = s.get("網(wǎng)址/cgi-bin/luci/;stok=固定密鑰/api/xqnetwork/pppoe_stop")
for ms in range(10):
print('斷網(wǎng)連接'+str(ms)+'秒')
time.sleep(1)
print('開始聯(lián)網(wǎng)切換IP')
r = s.get("網(wǎng)址/cgi-bin/luci/;stok=固定密鑰/api/xqnetwork/pppoe_start")
for ms in range(15):
print('等待聯(lián)網(wǎng)'+str(ms)+'秒')
time.sleep(1)
3、這里調(diào)用retrying模式,就是當(dāng)出現(xiàn)異常的時(shí)候,進(jìn)行重試,這樣就可以實(shí)現(xiàn)反復(fù)不斷的爬取內(nèi)容,
from retrying import retry
@retry(stop_max_attempt_number=50000,wait_fixed=2000)
def tyc():
#代碼
if __name__ == '__main__':
tyc()
最后我們的結(jié)果就變成這樣了。
最終結(jié)果
這樣,就可以不斷反復(fù)爬數(shù)據(jù)了,不過,有銀子,還是建議買代理吧,一般Vip代理好一點(diǎn)。