尝试网页抓取Rubies时,我无法通过登录。我完全不知道为什么我不能,但这里是我正在使用的cURL选项。如果有人发现问题,我将非常感激!
curl_setopt_array($curl, array(
CURLOPT_URL => "https://www.rubies.com/customer/account/loginPost/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HEADER => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => array('form_key' => "****", "login[username]" => "****", "login[password]" => "****", "persistent_remember_me" => 'on', "send" => ''),
CURLOPT_FOLLOWLOCATION => 1,
CURLOPT_COOKIEFILE => 'cookie.txt',
CURLOPT_COOKIEJAR => 'cookie.txt',
CURLOPT_HTTPHEADER => array(
'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36',
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Host: www.rubies.com',
'Content-Type: application/x-www-form-urlencoded',
'Origin: https://www.rubies.com',
'Referer: https://www.rubies.com/customer/account/',
'Connection: keep-alive',
'Cache-Control: no-cache',
'Upgrade-Insecure-Requests: 1'
),
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
CURLINFO_HEADER_OUT => true
));
我目前的表格密钥是硬编码的,但我不确定是否必须根据登录信息更改表单密钥。帖子的回复是空的,但我被重定向了2次。进入帐户页面,然后返回登录。如果有人能告诉我发生了什么,那么我将不胜感激。我认为他们正在使用某种基本的身份验证系统。
答案 0 :(得分:1)
使用fiddler2或其他数据包嗅探器来查看cURL流量请求和响应。使用浏览器将其与流量进行比较。
您可能错过或错误输入某个字段,或错过了后续步骤,例如设置Cookie和发布其他数据。
登录代码通常需要获取登录页面,抓取一次性令牌(随每个页面请求更改),然后作为第一步发布。这可能会触发脚本代码来设置cookie和/或自动提交其他数据。
答案 1 :(得分:1)
你告诉服务器你的POST主体是application/x-www-form-urlencoded
编码的,但是你给了CURLOPT_POSTFIELDS
一个数组,所以你实际上发送给服务器的是{{ 1}}编码。让curl发送帖子数据为multipart/form-data
,urlencode application/x-www-form-urlencoded
的数据 - 特别是数组,http_build_query会为你做这个。此外,在执行CURLOPT_POSTFIELDS
或multipart/form-data
时使用POST,根本不设置内容类型标头,curl会自动为您执行此操作,具体取决于所使用的编码。在该注释中,您也不应手动设置application/x-www-form-urlencoded
标题,而是使用User-Agent
。并且你也不应该设置CURLOPT_USERAGENT
标题,curl会自动生成,并且你比卷曲更容易犯错误。
此外,在这里你发送一个假的Host
标题,一些网站可以检测到引用者是假的,只是设置Referer
更安全,并提出一个真实的请求,从而获得一个真正的引用。另外,要实际登录CURLOPT_AUTOREFERER
,您需要一个cookie会话和一个https://www.rubies.com/customer/account/loginPost/
代码,form_key
可能与您的cookie会话绑定,可能是一种CSRF令牌,但是你没有提供任何代码来获得。最重要的是,您可能需要一个真实的form_key
。
使用https://github.com/divinity76/hhb_.inc.php/blob/master/hhb_.inc.php中的hhb_curl, 这是一个示例代码我认为能够使用真实的用户名/密码登录,不会出现上面列出的任何错误:
referer
编辑:修改了一个网址,原始代码肯定无法正常工作,但现在应该可以了。