使用requests进行get只获取到了一部分html源码,下面是我的代码
def get_url(self,url=None,proxies=None): header = { 'User-Agent' : 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0', 'Content-Type': 'application/x-www-form-urlencoded', 'Connection' : 'Keep-Alive', 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' } for prox in proxies: try: r=requests.get(url,proxies=prox,headers=header) if r.status_code!=200: continue else: print "使用{0}连接成功>>".format(prox) return r.content except Exception, e: return None
proxies参数是一个代理列表,这段代码会尝试使用proxies进行访问,访问成功就会返回
但是我获取到的页面源码不完整
巴扎黑2017-04-17 17:55:46
存在幾個原因
1.也許有些內容是透過ajax載入的。
所以透過requests.get是得不到全剖內容的,
建議透過使用firebug等工具去確定是不是這樣的原因。
是不是登入後才能有的內容。
PHP中文网2017-04-17 17:55:46
我的程式碼可以取得到頁面的全部內容,但沒有用requests的proxies參數。
試試看不用代理商能否獲得完整內容呢?
我的程式碼:
import requests
headers = {
'User-Agent' : 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0',
'Content-Type': 'application/x-www-form-urlencoded',
'Connection' : 'Keep-Alive',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
}
html = requests.get('http://www.xicidaili.com/nn/', headers=headers).text
print html
ringa_lee2017-04-17 17:55:46
我來說說怎麼排查吧。 【老司機勿吐槽】
1、使用chrome的network工具進行抓包(其他工具也行),比較response和你抓取的結果。如果相同,則表示這個頁面需要透過js進行渲染。
2、如果步驟1對比後結果不一致,則考慮header內的其他字段造成的影響了。一般情況下,cookie會影響存取權限,user-agent影響dom結構和內容。主要先排查這兩點。 (有可能會有一些奇奇怪怪的header則需要特殊處理)
3、開代理測試請求排除訪問ip被封鎖等問題
4、如果確定是js渲染的頁面。解決方案有二,一是抓取api介面(需要敏銳的發現規則能力),抓包方法參考1。二是直接在伺服器上進行js渲染(相關的運算),得到最終頁面渲染的結果。