python動態抓取
❶ python如何抓取動態頁面中的數據
你最好用spynner,ghost.py,之類的模擬瀏覽器的來做,
urllib是沒有用的,只能抓html靜態
❷ python如何爬取動態載入的網頁數據,例如我的打工網企業鏈接(需要底部的載入更多才會顯示)
content=urllib.urlopen(url).read()
forxin['LabelWageDes','LabelWorkDes','LabelEnterpriseDesc']:
pattern=re.compile(r'<spanid="ctl00_ContentPlaceHolder1_'+x+'">(.*?)</span></div>')
forvalueinpattern.findall(content):
split_values=value.split('<br/>')
forlineinsplit_values:
printline
❸ 如何用python抓取動態頁面的新聞
一般動態網頁都是使用js調取後台介面實現,抓一下包就看到了
❹ 如何用Python爬蟲抓取JS動態篩選內容
打開瀏覽器,以google chrome為例,輸入你上面的網址。
然後按F12打開調試窗口,然後嘗試勾選左邊某一個選項,馬上可以看到右邊的調試窗口有東西輸出。
找到第一個輸出的行,點擊header,可以看到每一個都是用的post方法。
所以只需要構造相應的header並post上去,就可以得到你想要的數據了。
而這個發放返回的是json數據,然後編碼成dict格式 提取出數據就可以了。
❺ python爬蟲,抓取動態內容,判斷後更新變數
你看看他們說的都可以
你要把header信息加上去,用urllib2的request來獲取圖片,如果還有問題再把cookie的內容也加進去。
❻ Python如何爬取動態數據實現方法
你指的是動態渲染生成的頁面的爬取吧,類似於微博的下拉刷新這種?如果是,分析找到它的ajax請求,一般是xhr。其實也可以考慮使用selinum模塊(但願我沒拼錯這個模塊名)
❼ python 如何抓取動態頁面內容
輸入url,得到html,我早就寫了函數了
自己搜:
getUrlRespHtml
就可以找到對應的python函數:
#------------------------------------------------------------------------------
defgetUrlResponse(url,postDict={},headerDict={},timeout=0,useGzip=False,postDataDelimiter="&"):
"""Getresponsefromurl,supportoptionalpostDict,headerDict,timeout,useGzip
Note:
1.ifpostDictnotnull,
2ifyouwanttoautohandlecookies,()beforeusethisfunction.
thenfollowingurllib2.Requestwillautohandlecookies
"""
#makesureurlisstring,notunicode,otherwiseurllib2.urlopenwillerror
url=str(url);
if(postDict):
if(postDataDelimiter=="&"):
postData=urllib.urlencode(postDict);
else:
postData="";
foreachKeyinpostDict.keys():
postData+=str(eachKey)+"="+str(postDict[eachKey])+postDataDelimiter;
postData=postData.strip();
logging.info("postData=%s",postData);
req=urllib2.Request(url,postData);
logging.info("req=%s",req);
req.add_header('Content-Type',"application/x-www-form-urlencoded");
else:
req=urllib2.Request(url);
defHeaderDict={
'User-Agent':gConst['UserAgent'],
'Cache-Control':'no-cache',
'Accept':'*/*',
'Connection':'Keep-Alive',
};
#adddefaultheadersfirstly
foreachDefHdindefHeaderDict.keys():
#print"adddefaultheader:%s=%s"%(eachDefHd,defHeaderDict[eachDefHd]);
req.add_header(eachDefHd,defHeaderDict[eachDefHd]);
if(useGzip):
#print"usegzipfor",url;
req.add_header('Accept-Encoding','gzip,deflate');
#addcustomizedheaderlater->allowoverwritedefaultheader
if(headerDict):
#print"addedheader:",headerDict;
forkeyinheaderDict.keys():
req.add_header(key,headerDict[key]);
if(timeout>0):
#settimeoutvalueifnecessary
resp=urllib2.urlopen(req,timeout=timeout);
else:
resp=urllib2.urlopen(req);
#updatecookiesintolocalfile
if(gVal['cookieUseFile']):
gVal['cj'].save();
logging.info("gVal['cj']=%s",gVal['cj']);
returnresp;
#------------------------------------------------------------------------------
#getresponsehtml==bodyfromurl
#defgetUrlRespHtml(url,postDict={},headerDict={},timeout=0,useGzip=False):
defgetUrlRespHtml(url,postDict={},headerDict={},timeout=0,useGzip=True,postDataDelimiter="&"):
resp=getUrlResponse(url,postDict,headerDict,timeout,useGzip,postDataDelimiter);
respHtml=resp.read();
#here,maybe,evenifnotsendAccept-Encoding:gzip,deflate
#butstillresponsegzipordeflate,sodirectlydoundecompress
#if(useGzip):
#print"---beforeunzip,len(respHtml)=",len(respHtml);
respInfo=resp.info();
#Server:nginx/1.0.8
#Date:Sun,08Apr201212:30:35GMT
#Content-Type:text/html
#Transfer-Encoding:chunked
#Connection:close
#Vary:Accept-Encoding
#...
#Content-Encoding:gzip
#sometime,therequestusegzip,deflate,butactuallyreturnedisun-gziphtml
#->responseinfonotincludeabove"Content-Encoding:gzip"
#eg:http://blog.sina.com.cn/s/comment_730793bf010144j7_3.html
#->
#Content-Encoding:deflate
if("Content-Encoding"inrespInfo):
if("gzip"==respInfo['Content-Encoding']):
respHtml=zlib.decompress(respHtml,16+zlib.MAX_WBITS);
elif("deflate"==respInfo['Content-Encoding']):
respHtml=zlib.decompress(respHtml,-zlib.MAX_WBITS);
returnrespHtml;
及示例代碼:
url="http://www.crifan.com";
respHtml=getUrlRespHtml(url);
完全庫函數,自己搜:
crifanLib.py
關於抓取動態頁面,詳見:
Python專題教程:抓取網站,模擬登陸,抓取動態網頁
(自己搜標題即可找到)
❽ 如何用Python爬取動態載入的網頁數據
動態網頁抓取都是典型的辦法
直接查看動態網頁的載入規則。如果是版ajax,則將ajax請求找權出來給python。 如果是js去處後生成的URL。就要閱讀JS,搞清楚規則。再讓python生成URL。這就是常用辦法
辦法2,使用python調用webkit內核的,IE內核,或者是firefox內核的瀏覽器。然後將瀏覽結果保存下來。通常可以使用瀏覽器測試框架。它們內置了這些功能
辦法3,通過http proxy,抓取內容並進行組裝。甚至可以嵌入自己的js腳本進行hook. 這個方法通常用於系統的反向工程軟體
❾ python爬蟲怎麼獲取動態的網頁源碼
一個月前實習導師布置任務說通過網路爬蟲獲取深圳市氣象局發布的降雨數據,網頁如下:
心想,爬蟲不太難的,當年跟zjb爬煎蛋網無(mei)聊(zi)圖的時候,多麼清高。由於接受任務後的一個月考試加作業一大堆,導師也不催,自己也不急。
但是,導師等我一個月都得讓我來寫意味著這東西得有多難吧。。。今天打開一看的確是這樣。網站是基於Ajax寫的,數據動態獲取,所以無法通過下載源代碼然後解析獲得。
從某不良少年寫的抓取淘寶mm的例子中收到啟發,對於這樣的情況,一般可以同構自己搭建瀏覽器實現。phantomJs,CasperJS都是不錯的選擇。
導師的要求是獲取過去一年內深圳每個區每個站點每小時的降雨量,執行該操作需要通過如上圖中的歷史查詢實現,即通過一個時間來查詢,而這個時間存放在一個hidden類型的input標簽里,當然可以通過js語句將其改為text類型,然後執行send_keys之類的操作。然而,我失敗了。時間可以修改設置,可是結果如下圖。
為此,僅抓取實時數據。選取python的selenium,模擬搭建瀏覽器,模擬人為的點擊等操作實現數據生成和獲取。selenium的一大優點就是能獲取網頁渲染後的源代碼,即執行操作後的源代碼。普通的通過 url解析網頁的方式只能獲取給定的數據,不能實現與用戶之間的交互。selenium通過獲取渲染後的網頁源碼,並通過豐富的查找工具,個人認為最好用的就是find_element_by_xpath("xxx"),通過該方式查找到元素後可執行點擊、輸入等事件,進而向伺服器發出請求,獲取所需的數據。
[python]view plain
#coding=utf-8
fromtestStringimport*
fromseleniumimportwebdriver
importstring
importos
fromselenium.webdriver.common.keysimportKeys
importtime
importsys
default_encoding='utf-8'
ifsys.getdefaultencoding()!=default_encoding:
reload(sys)
sys.setdefaultencoding(default_encoding)
district_navs=['nav2','nav1','nav3','nav4','nav5','nav6','nav7','nav8','nav9','nav10']
district_names=['福田區','羅湖區','南山區','鹽田區','寶安區','龍崗區','光明新區','坪山新區','龍華新區','大鵬新區']
flag=1
while(flag>0):
driver=webdriver.Chrome()
driver.get("hianCe/")
#選擇降雨量
driver.find_element_by_xpath("//span[@id='fenqu_H24R']").click()
filename=time.strftime("%Y%m%d%H%M",time.localtime(time.time()))+'.txt'
#創建文件
output_file=open(filename,'w')
#選擇行政區
foriinrange(len(district_navs)):
driver.find_element_by_xpath("//div[@id='"+district_navs[i]+"']").click()
#printdriver.page_source
timeElem=driver.find_element_by_id("time_shikuang")
#輸出時間和站點名
output_file.write(timeElem.text+',')
output_file.write(district_names[i]+',')
elems=driver.find_elements_by_xpath("//span[@onmouseover='javscript:changeTextOver(this)']")
#輸出每個站點的數據,格式為:站點名,一小時降雨量,當日累積降雨量
foreleminelems:
output_file.write(AMonitorRecord(elem.get_attribute("title"))+',')
output_file.write(' ')
output_file.close()
driver.close()
time.sleep(3600)
- 文件中引用的文件testString只是修改輸出格式,提取有效數據。
#Encoding=utf-8
defOnlyCharNum(s,oth=''):
s2=s.lower()
fomart=',.'
forcins2:
ifnotcinfomart:
s=s.replace(c,'')
returns
defAMonitorRecord(str):
str=str.split(":")
returnstr[0]+","+OnlyCharNum(str[1])
- 一小時抓取一次數據,結果如下:
[python]view plain