网络爬虫能jqgrid获取所有数据企业后台网站数据么

如何获取跨域网站接口数据-问答-最代码广告加载中,请稍后...&&等如何获取跨域网站接口数据现在有个需求是这样的,我们的系统里面要调用另一个网站中的两个url地址;url1 &是一个登录url;url2 &是一个下载文件url;但是调用url2需要先调用一次url1 &并且返回登录成功,url1返回的数据结构为json格式;我们的业务需求是要在浏览器中调用url2 &下载这个文件,但是限于 这两个url都是另一个网站的,ajax访问又不能跨域访问,现在有没有办法就是先调用一次url1,如果url1返回成功再调用url2下载文件;弄了半天也没找到好的办法解决;谁写过相关的需求麻烦支个招;谢了2个牛币所有回答列表(5)&LV41.采用jsonp的方式,2.采用代理访问的方式,比如你自己的接口地址/b.json,第三方的接口/c.json你看这样行不行, &你现在一个页面的ajax在后台调用url1,这个url1应该可以在后台调用的吧,调用后解析返回的json判断是否成功,如果成功了,再在ajax中去做成功的跳转,这样也就相当于你在浏览器中当问了用Webservice代理方式啊!个人觉得处理跨域调用很方便用Apache 的httpclient包吧,http协议全部支持,你这个毫无问题我也感觉用cxf还是很好的等完完等等等完等完等完等最热搜索问答话题编程语言基础Web开发数据库开发客户端开发脚本工具游戏开发服务器软硬件开源组件类库相关问答等等等等等完等等等完等等最近浏览暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级扫描二维码关注最代码为好友"/>扫描二维码关注最代码为好友如何应对网站反爬虫策略?如何高效地爬大量数据?
像一些大型的网站会有反爬虫策略…比如我之前在爬淘宝评论后很快就会被封,大概是短时间爬太多…有什么好的策略吗?比如代理?不过感觉代理也不能稳定吧…
按投票排序
爬虫(Spider),反爬虫(Anti-Spider),反反爬虫(Anti-Anti-Spider),这之间的斗争恢宏壮阔...Day 1小莫想要某站上所有的电影,写了标准的爬虫(基于HttpClient库),不断地遍历某站的电影列表页面,根据 Html 分析电影名字存进自己的数据库。这个站点的运维小黎发现某个时间段请求量陡增,分析日志发现都是 IP(1.1.1.1)这个用户,并且 useragent 还是 JavaClient1.6 ,基于这两点判断非人类后直接在Nginx 服务器上封杀。Day 2小莫电影只爬了一半,于是也针对性的变换了下策略:1. useragent 模仿百度("Baiduspider..."),2. IP每爬半个小时就换一个IP代理。小黎也发现了对应的变化,于是在 Nginx 上设置了一个频率限制,每分钟超过120次请求的再屏蔽IP。 同时考虑到百度家的爬虫有可能会被误伤,想想市场部门每月几十万的投放,于是写了个脚本,通过 hostname 检查下这个 ip 是不是真的百度家的,对这些 ip 设置一个白名单。Day 3小莫发现了新的限制后,想着我也不急着要这些数据,留给服务器慢慢爬吧,于是修改了代码,随机1-3秒爬一次,爬10次休息10秒,每天只在8-12,18-20点爬,隔几天还休息一下。小黎看着新的日志头都大了,再设定规则不小心会误伤真实用户,于是准备换了一个思路,当3个小时的总请求超过50次的时候弹出一个验证码弹框,没有准确正确输入的话就把 IP 记录进黑名单。Day 4小莫看到验证码有些傻脸了,不过也不是没有办法,先去学习了图像识别(关键词 PIL,tesseract),再对验证码进行了二值化,分词,模式训练之后,识别了小黎的验证码(关于验证码,验证码的识别,验证码的反识别也是一个恢弘壮丽的斗争史,这里先不展开....),之后爬虫又跑了起来。小黎是个不折不挠的好同学,看到验证码被攻破后,和开发同学商量了变化下开发模式,数据并不再直接渲染,而是由前端同学异步获取,并且通过 js 的加密库生成动态的 token,同时加密库再进行混淆(比较重要的步骤的确有网站这样做,参见微博的登陆流程)。Day5混淆过的加密库就没有办法了么?当然不是,可以慢慢调试,找到加密原理,不过小莫不准备用这么耗时耗力的方法,他放弃了基于 HttpClient的爬虫,选择了内置浏览器引擎的爬虫(关键词:PhantomJS,Selenium),在浏览器引擎中js 加密脚本算出了正确的结果,又一次拿到了对方的数据。小黎:.....爬虫与发爬虫的斗争还在继续。不过实际应用时候,一般大家做到根据 IP 限制频次就结束了,除非很核心的数据,不会再进行更多的验证,毕竟工程的问题一半是成本的问题。至于高效部分,一些 Tips:1.尽量减少请求次数,能抓列表页就不抓详情页2.不要只看 Web 网站,还有 App 和 H5,他们的反爬虫措施一般比较少3.如果真的对性能要求很高,可以考虑多线程(一些成熟的框架如 scrapy都已支持),甚至分布式另外,想深入研究爬虫/反爬虫的同学,可以把简历发过来: shenyubao&At& ,本广告长期有效。==== 修改几处 spider 拼写错误,感谢
我写过一个rss个小工具,爬取搜狗微信公众号搜索的非公开接口,没做宣传的时候,流量不大,用的比较好,宣传后,用的人多了,就发现被反爬虫了,一直500通过chrome的开发者工具分析搜狗页面的请求,发现不是通过ip反爬,而是cookie里的几个关键字段,应对方法就是写个定时任务,维护一个cookie池,定时更新cookie,爬的时候随机取cookie,现在基本不会出现500所以应对反爬虫,先分析服务器是通过什么来反爬,通过ip就用代理,通过cookie就换cookie,针对性的构建request。
Python学习网络爬虫主要分3个大的版块:抓取,分析,存储另外,比较常用的爬虫框架,这里最后也详细介绍一下。首先列举一下本人总结的相关文章,这些覆盖了入门网络爬虫需要的基本概念和技巧:当我们在浏览器中输入一个url后回车,后台会发生什么?比如说你输入,你就会看到宁哥的小站首页。简单来说这段过程发生了以下四个步骤:查找域名对应的IP地址。向IP对应的服务器发送请求。服务器响应请求,发回网页内容。浏览器解析网页内容。网络爬虫要做的,简单来说,就是实现浏览器的功能。通过指定url,直接返回给用户所需要的数据,而不需要一步步人工去操纵浏览器获取。抓取这一步,你要明确要得到的内容是是什么?是HTML源码,还是Json格式的字符串等。1. 最基本的抓取抓取大多数情况属于get请求,即直接从对方服务器上获取数据。首先,Python中自带urllib及urllib2这两个模块,基本上能满足一般的页面抓取。另外,也是非常有用的包,与此类似的,还有等等。Requests:
import requests
response = requests.get(url)
content = requests.get(url).content
print "response headers:", response.headers
print "content:", content
import urllib2
response = urllib2.urlopen(url)
content = urllib2.urlopen(url).read()
print "response headers:", response.headers
print "content:", content
Httplib2:
import httplib2
http = httplib2.Http()
response_headers, content = http.request(url, 'GET')
print "response headers:", response_headers
print "content:", content
此外,对于带有查询字段的url,get请求一般会将来请求的数据附在url之后,以?分割url和传输数据,多个参数用&连接。data = {'data1':'XXXXX', 'data2':'XXXXX'}
Requests:data为dict,json
import requests
response = requests.get(url=url, params=data)
Urllib2:data为string
import urllib, urllib2
data = urllib.urlencode(data)
full_url = url+'?'+data
response = urllib2.urlopen(full_url)
相关参考:参考项目:2. 对于登陆情况的处理2.1 使用表单登陆这种情况属于post请求,即先向服务器发送表单数据,服务器再将返回的cookie存入本地。data = {'data1':'XXXXX', 'data2':'XXXXX'}
Requests:data为dict,json
import requests
response = requests.post(url=url, data=data)
Urllib2:data为string
import urllib, urllib2
data = urllib.urlencode(data)
req = urllib2.Request(url=url, data=data)
response = urllib2.urlopen(req)
2.2 使用cookie登陆使用cookie登陆,服务器会认为你是一个已登陆的用户,所以就会返回给你一个已登陆的内容。因此,需要验证码的情况可以使用带验证码登陆的cookie解决。import requests
requests_session = requests.session()
response = requests_session.post(url=url_login, data=data)
若存在验证码,此时采用response = requests_session.post(url=url_login, data=data)是不行的,做法应该如下:response_captcha = requests_session.get(url=url_login, cookies=cookies)
response1 = requests.get(url_login) # 未登陆
response2 = requests_session.get(url_login) # 已登陆,因为之前拿到了Response Cookie!
response3 = requests_session.get(url_results) # 已登陆,因为之前拿到了Response Cookie!
相关参考:参考项目:3. 对于反爬虫机制的处理3.1 使用代理适用情况:限制IP地址情况,也可解决由于“频繁点击”而需要输入验证码登陆的情况。这种情况最好的办法就是维护一个代理IP池,网上有很多免费的代理IP,良莠不齐,可以通过筛选找到能用的。对于“频繁点击”的情况,我们还可以通过限制爬虫访问网站的频率来避免被网站禁掉。proxies = {'http':'http://XX.XX.XX.XX:XXXX'}
Requests:
import requests
response = requests.get(url=url, proxies=proxies)
import urllib2
proxy_support = urllib2.ProxyHandler(proxies)
opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler)
urllib2.install_opener(opener) # 安装opener,此后调用urlopen()时都会使用安装过的opener对象
response = urllib2.urlopen(url)
3.2 时间设置适用情况:限制频率情况。Requests,Urllib2都可以使用time库的sleep()函数:import time
time.sleep(1)
3.3 伪装成浏览器,或者反“反盗链”有些网站会检查你是不是真的浏览器访问,还是机器自动访问的。这种情况,加上User-Agent,表明你是浏览器访问即可。有时还会检查是否带Referer信息还会检查你的Referer是否合法,一般再加上Referer。headers = {'User-Agent':'XXXXX'} # 伪装成浏览器访问,适用于拒绝爬虫的网站
headers = {'Referer':'XXXXX'}
headers = {'User-Agent':'XXXXX', 'Referer':'XXXXX'}
Requests:
response = requests.get(url=url, headers=headers)
import urllib, urllib2
req = urllib2.Request(url=url, headers=headers)
response = urllib2.urlopen(req)
4. 对于断线重连不多说。def multi_session(session, *arg):
while True:
retryTimes = 20
while retryTimes&0:
return session.post(*arg)
print '.',
retryTimes -= 1
或者def multi_open(opener, *arg):
while True:
retryTimes = 20
while retryTimes&0:
return opener.open(*arg)
print '.',
retryTimes -= 1
这样我们就可以使用multi_session或multi_open对爬虫抓取的session或opener进行保持。5. 多进程抓取这里针对进行并行抓取的实验对比: 与 相关参考:6. 对于Ajax请求的处理对于“加载更多”情况,使用Ajax来传输很多数据。它的工作原理是:从网页的url加载网页的源代码之后,会在浏览器里执行JavaScript程序。这些程序会加载更多的内容,“填充”到网页里。这就是为什么如果你直接去爬网页本身的url,你会找不到页面的实际内容。这里,若使用Google Chrome分析”请求“对应的链接(方法:右键→审查元素→Network→清空,点击”加载更多“,出现对应的GET链接寻找Type为text/html的,点击,查看get参数或者复制Request URL),循环过程。如果“请求”之前有页面,依据上一步的网址进行分析推导第1页。以此类推,抓取抓Ajax地址的数据。对返回的json格式数据(str)进行正则匹配。json格式数据中,需从'\uxxxx'形式的unicode_escape编码转换成u'\uxxxx'的unicode编码。7. 自动化测试工具SeleniumSelenium是一款自动化测试工具。它能实现操纵浏览器,包括字符填充、鼠标点击、获取元素、页面切换等一系列操作。总之,凡是浏览器能做的事,Selenium都能够做到。这里列出在给定城市列表后,使用selenium来动态抓取的票价信息的代码。参考项目:8. 验证码识别对于网站有验证码的情况,我们有三种办法:使用代理,更新IP。使用cookie登陆。验证码识别。使用代理和使用cookie登陆之前已经讲过,下面讲一下验证码识别。可以利用开源的Tesseract-OCR系统进行验证码图片的下载及识别,将识别的字符传到爬虫系统进行模拟登陆。如果不成功,可以再次更新验证码识别,直到成功为止。参考项目:爬取有两个需要注意的问题:如何监控一系列网站的更新情况,也就是说,如何进行增量式爬取?对于海量数据,如何实现分布式爬取?分析抓取之后就是对抓取的内容进行分析,你需要什么内容,就从中提炼出相关的内容来。常见的分析工具有,,等等。存储分析出我们需要的内容之后,接下来就是存储了。我们可以选择存入文本文件,也可以选择存入或数据库等。存储有两个需要注意的问题:如何进行网页去重?内容以什么形式存储?ScrapyScrapy是一个基于Twisted的开源的Python爬虫框架,在工业中应用非常广泛。相关内容可以参考,同时给出这篇文章介绍的爬取的项目代码,给大家作为学习参考。参考项目:
如 @朱添一 所说, 反反爬虫策略是依靠定向爬取源的反爬虫策略而定的. 一般有一下几种一些常用的方法IP代理 对于IP代理,各个语言的Native Request API都提供的IP代理响应的API, 需要解决的主要就是IP源的问题了.网络上有廉价的代理IP(1元4000个左右), 我做过简单的测试, 100个IP中, 平均可用的在40-60左右, 访问延迟均在200以上.网络有高质量的代理IP出售, 前提是你有渠道.因为使用IP代理后, 延迟加大, 失败率提高, 所以可以将爬虫框架中将请求设计为异步, 将请求任务加入请求队列(RabbitMQ,Kafka,Redis), 调用成功后再进行回调处理, 失败则重新加入队列. 每次请求都从IP池中取IP, 如果请求失败则从IP池中删除该失效的IP.Cookies 有一些网站是基于cookies做反爬虫, 这个基本上就是如 @朱添一 所说的, 维护一套Cookies池注意研究下目标网站的cookies过期事件, 可以模拟浏览器, 定时生成cookies限速访问 像开多线程,循环无休眠的的暴力爬取数据, 那真是分分钟被封IP的事, 限速访问实现起来也挺简单(用任务队列实现), 效率问题也不用担心, 一般结合IP代理已经可以很快地实现爬去目标内容.一些坑大批量爬取目标网站的内容后, 难免碰到红线触发对方的反爬虫机制. 所以适当的告警提示爬虫失效是很有必有的.一般被反爬虫后, 请求返回的HttpCode为403的失败页面, 有些网站还会返回输入验证码(如豆瓣), 所以检测到403调用失败, 就发送报警, 可以结合一些监控框架, 如Metrics等, 设置短时间内, 告警到达一定阀值后, 给你发邮件,短信等.当然, 单纯的检测403错误并不能解决所有情况. 有一些网站比较奇葩, 反爬虫后返回的页面仍然是200的(如去哪儿), 这时候往往爬虫任务会进入解析阶段, 解析失败是必然的. 应对这些办法, 也只能在解析失败的时候, 发送报警, 当告警短时间到达一定阀值, 再触发通知事件. 当然这个解决部分并不完美, 因为有时候, 因为网站结构改变, 而导致解析失败, 同样回触发告警. 而你并不能很简单地区分, 告警是由于哪个原因引起的.
对于反爬虫我是比较阴的,通过行为判断出是爬虫来,我是不直接拒绝的,而是提供比较真实的伪数据和真数据混在一起,让他们抓几个月后才发现数据不是全部正确,白白浪费时间,让他们很难发现我的反扒规则。关于如何通过行为判断是爬虫,这个至关重要,访客和爬虫最大区别是,访客是至少访问你几个页面,每个页面间隔也是比较长的,而且每个页面都是加载解析整个html代码和资源,包括img,js,css。而爬虫只是简单粗暴的获取你的数据,不管你的网页元素。
拿到阿里云、腾讯云、新浪云等云机房ip段,来自这些ip段的均复杂验证码伺候。亲测有效。
首先要明确一点的就是:在爬虫与反爬的对抗中,爬虫最终会获胜,因为爬虫可以模仿人的行为去浏览网页。那么如何对抗反爬呢?下面是做法。
1.代理和流控的结合一般网站检测到一个ip在短时间内多次向本站发出不同的HTTP请求,就会认为这是一个爬虫,并将其ip封一段时间。所以对于单个ip来说,降低发出请求的速率可以较好的逃过反爬的检测,如果有上万个代理ip,同时做流控就会比较快的爬取。至于代理如何快速的获得,可以通过购买高质量的代理服务(比如 快代理 ),或者自己爬取。
2.动态修改http head
下面几个字段随时动态的修改,可以避过反爬策略。cookie refer user agent 以及http 头中的几个常用字段。但是,一个ip不要用多个user agent,用了的话这明显是告诉人家你在用爬虫。。 如何高效的爬取?下面给出几个建议吧:构建一个能高效爬取的系统,你还需要:高带宽的网络:这个你懂,平均一个网页100+kb,小水管的话爬个毛线,那么多代理给你回传数据你接都接不过来容错机制:代理服务器都是不稳定的,随时可能就不可用了,爬着爬着就会出现很多HTTP错误,所以针对一个爬虫系统需要一个容错机制,没爬下来的url要继续爬,直到爬下来确认数据完整为止。高速存储:爬虫系统的速度瓶颈主要就在存储和带宽上,至于存储,选用Hbase而不是MySQL,实测过,导出300+GB的数据,Hbase几分钟搞定,MySQL好几个小时。PhantomJS、cURL等API,验证码识别。登陆功能:要爬取微博这种需要登陆才能浏览内容的网站,肯定需要写一个登陆功能的,这里就需要注册很多的僵尸账号了,而且还需要维护僵尸账号的cookie池,很麻烦。采用非人力的方法写爬虫:针对一个网站写爬虫太累了。。来一个任务写一个爬虫,用java写真心累啊。。所以还是想想怎么把爬虫的所有工具和API封装一下吧,用简单的配置和操作就可以完成对当前任务的快速爬取。嗯,以上。
“爬”,本身就是一种对抗行为。要尽量隐匿自己的行为,方法论很多不细讲了,没有屠龙之技。最重要的是不能影响对方运维的 KPI ,不能严重到对方研发介入。码农都是混口饭过日子的,都不容易,逼的对方加班升级加策略的最终码农和产品经理去PK 直接就把功能下线了。
歪楼,做好的防抓方法就是不给提示,一点都不给。爬虫超过你给的界限。直接返回大量随机无效数据。让他找特点去吧
天天更新验证和反爬模块
只有是自动化的反爬虫策略都能破。唯一不能破的就是人工干预的反爬虫机制——编死的代码永远不能与人的智慧抗衡。
如何反爬虫?常用的,基于IP,基于cookie,挑战响应,等.如何爬的快又多?如果基于IP,找到阙值,在邻近阙值的情况下分布式采集,基于cookie?cookie池基于挑战响应?如果挑战是一个随机js,爬虫要么内置个js解释器(麻烦)要么爬虫在某个开源浏览内核一起工作,如果挑战是个随机的flash,最简单的方法,找这个网站的ios版
以前在MSRA协助别人做人工智能的研究的时候,我也写过爬虫。不过在公司里面写爬虫超级安全,我们只需要跟bing申请一下,然后爬cache(逃
试着用tor代理?开几十个tor代理池,每次发送请求前随机从代理池里取一个。
只要你开价够高,对方会直接把你想要的数据按照你希望的方式提供给你。
爬虫其实很好检验,页面里不起眼的角落放一个链接,谁点了谁就是爬虫,验证码伺候。怎么破?
要知道反爬虫是一定能轻易干掉反反爬虫的。只是别人不愿意,或懒得去做罢了。什么代理ip,cookies,都弱爆了。反爬虫方一个行为验证加蜜罐直接把代理ip封地连妈都不认识。
我有个反爬虫的想法,在页面放一个链接,但是display属性设置为none或者颜色等于background-color或者链接被其他的div挡住或者链接位置超出屏幕,正常用户是不可能访问这个页面的,如果有人访问了我就认为他是爬虫,封ip。第一次修改:如果是很有针对的抓取,上面的方法就没用了。
我一般有以下解决方案:1.如果是限制用户,我选择多个用户轮流登录,通过cookie之类的加载到请求信息里,来突破对用户的限制。2.如果限制ip,则通过在程序中使用代理IP,使目标网站认为你不是同一个IP在连续访问,可避免被发现而限制访问。代理IP网上多的是,质量不太好,需要自己测试。3.如果限制访问次数可以少启动一些线程,避免目标网站服务器压力过大。
已有帐号?
无法登录?
社交帐号登录下次自动登录
现在的位置:
& 综合 & 正文
爬虫如何抓取到asp.net中-dopostback获取新页面的数据
在Web 2.0时代,很多网站采用AJAX技术实现,带来较好用户体验的代价是,Javascript得到的内容搜索引擎无法爬到,Google也正在研究此种技术。本文讨论Asp.Net生成的链接,爬虫如何能爬进去的问题。问
题:某网站出现的数据列表分页显示,而上一页和下一页都是用__doPostBack提交到后台处理,如
javascript:__doPostBack(ucInfoListMore$gridInfoList$_ctl21$_ctl1,),我们根本得
不到他绝对链接的地址,而且每一页得下一页传入的参数是一样的。分析:我们首先理解__doPostBack做了哪些事情。function __doPostBack(eventTarget, eventArgument) {if (window.navigator.appName.toLowerCase().indexOf("netscape") & -1) {theform = document.forms["Form1"];//注意此处的FormID} else {theform = document.Form1;//还有此处}theform.__EVENTTARGET.value = eventTarget.split("$").join(":");theform.__EVENTARGUMENT.value = eventAtheform.submit();}明
白了吧,问题就在.__EVENTTARGET(后台处理的事件)和__EVENTARGUMENT上。这样就简单了,我们可以给这两个参数赋值,然后向
后台发送Post就可以了。那么如何指定某一页呢,Asp.Net在后台是以Session方式保存当前页信息的,我们在Post得时候能够保证实在同一
个会话中进行的就可以了。
&&&&推荐文章:
【上篇】【下篇】

我要回帖

更多关于 jqgrid获取所有数据 的文章

 

随机推荐