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