php curl采集数据问题汇总
2018-01-09 15:53 ZengGW 阅读(1470) 评论(1) 编辑 收藏 举报1. 使用curl获取网页数据提示: "curl: (6) Could not resolve host: xxx.xxx.com ; Name or service not known"
解决方法:添加host(ip url,网址对应的ip);
2.curl提交数据给服务器的时候,出现了提交文本text,不是'key=val&key=val'这种形式的,而是带换行的那种字符串,这是就不能使用http_build_query函数
解决方法:
a.使用php中的定界符<<<,然后在定界符中间写需要传输的字符串,该换行就换行;
b.在传输字符串的时候一定要注意字符串的单双引号,字符串是单引号括住的有时候传输之后会报错,得不到预期的数据,这时候就改成双引号即可;
3.在采集数据的过程中,有时候提交的数据中的某个参数你在页面上始终找不到的时候该怎么办?
解决办法:特殊参数值可能保存在cookie、js或者需要重新请求一个新的url获得参数的值
4.ip被指定网站屏蔽了怎么办?
解决方法:linux的curl中有个-x的选项,设置匿名代理的ip和端口即可 curl -x 192.168.0.1:8080 http://www.baidu.com.
5.当使用linux的curl模拟登陆某个网站时,提示登陆成功了,但是当你去获取比如用户的详细信息时,怎么都获取不到?返回的页面信息提示你去登陆,这是怎么回事呢???
说明:今天遇到按要求抓取一个很简单的网站,但是就在模拟登陆成功后准备做其他操作的时候,返回的信息一直就是提示要你去登陆,你未登陆,真心是很奇怪...
猜想与解决:
1.你在登陆成功后要获取某个页面的时候,必须要把过程页面也都获取一遍(说明:过程页面?比如登陆成功后跳转到A页面,这时候你要获取用户的基本信息,你需要点击用户中心这个按钮进入用户的个人中心B页面,然后进入B页面后它会触发ajax请求用户的数据这里请求的url我们称为C,那么有些网站很厉害了,你如果登陆成功后,直接curl去请求C页面,是获取不到任何信息的,相反会提示一堆的错误或者别的情况的信息);
解决:根据步骤先获取A页面数据;再请求B页面的数据;最后再获取C也就是用户数据
2.cookie内缺少参数:我今天碰到的就是这个问题,cookie内本来是“PHPSESSID=5b5b92d8d664629a83b3adb1e1e1a393; CheckCode=1237”这些内容,而我模拟登陆后的cookie文件内只有“CheckCode=1237”,缺少了PHPSESSID参数,造成就算你提交数据登陆返回了登陆成功,你也获取不到具体的数据;
解决:
a.查找所有与该网站有关的js和登陆页面相关的html文件,是否存在代码生成该参数,或者有些网站每次请求都把该参数写到固定的js文件内,需要curl获取该js文件然后匹配出来,拼接到cookie中;
b.在上一步没有找到的时候,这时候你要是要抓包工具抓取在从进入登陆页面到登陆完成以及进入数据页面的这个过程中请求的所有的页面,在这些请求内找到cookie内的PHPSESSID参数是从哪个url请求的时候开始有这个参数的(比如:进入登陆页面a,a的请求header等信息内cookie内没有设置该参数,那么就找下一个url,比如是获取验证码url,看看是否设置了,一直这么找 ....,直到找到从哪个url开始cookie设置了该参数,那么只需要curl请求一次该url即可,注意请求该url的位置)
c.第三种情况最特殊,有些网站它的登陆入口有好几个,一般的会有两个,一个直接在首页有一个登陆的地方,一个就是单独的登陆页面,而且从这两个登陆的入口点击登陆成功后跳转的页面可能有所不同,在浏览器上操作两个入口登陆都能获取对应的内容,但是当我们使用curl进行模拟登陆获取数据的时候就会出现意想不到的事情,那就是当你从首页这个入口登陆进去,获取用户的数据,可以登陆成功,但是在进入数据页面获取对应数据的时候怎么都获取不到,很是郁闷,我之前遇到该问题,苦恼了很长时间,想不出来试哪里出了问题;后来我仔细一想,我换一个入口进入数据页面也许就可行,结果果然可以(就好比是数据页面是目标页面C,那么从首页登陆进来跳转到了B页面,从B页面直接进入C页面的话获取数据死活获取不到;当你从登陆页登陆跳转到D页面,D页面再进入C页面,这个时候就能获取成功,这就是目标一样,但是在到达目标之前有一个岔路口e和f,只有一条路可以走到目标)
d.经过上几步还是无法获取成功,那么可能就需要咱们在使用curl请求的时候手动拼接cookie缺失的参数了,形式如下:
--cookie 'phoneflag=0; loanaccnum=""; gjjaccnum='xxxx'; gjjaccname='xxx'; gjjcertinum=xxxxxxx'
有些cookie中的数据需要你去请求特定的url,然后获取到之后拼接成cookie即可(手动拼接)