爬虫请教,请问如何爬 "http://www.kuaidaili.com/" 的数据

2016-04-07 18:30:21 +08:00
 odirus
经过测试

( 1 )模拟浏览器 header 不行;
( 2 )使用 phantomjs 也不行;

"http://www.yundun.com/" 这网站提供的防爬虫设计。

求一个简单易行的思路,我也不知道怎么才能突破反爬虫规则
6347 次点击
所在节点    问与答
23 条回复
popok
2016-04-07 18:46:23 +08:00
什么问题?
频率限制还是什么的??

这网站默认 gzip
popok
2016-04-07 18:48:51 +08:00
这个 yundun 只是一个 cdn 而已吧,你抓不到明文数据应该就是返回的数据都是 gzip 压缩的,你本地再解压一下,就能处理了
naomhan
2016-04-07 18:49:11 +08:00
没有吧 我记得 kuaidaili 很好爬的
binux
2016-04-07 18:56:15 +08:00
使用 phantomjs 没有问题
gimp
2016-04-07 19:08:23 +08:00
#!/bin/env python
# -*- encoding:utf-8 -*-
from selenium import webdriver
import time

driver = webdriver.Firefox()
driver.set_window_size(1366, 768)
driver.get("http://www.kuaidaili.com/")
time.sleep(10)
bodyStr= driver.find_element_by_tag_name("table").get_attribute("innerHTML")
print bodyStr

很好抓呀,当然,要是觉得 time.sleep(10)太 low

#!/bin/env python
# -*- encoding:utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()
driver.set_window_size(1366, 768)
driver.get("http://www.kuaidaili.com/")
wait = WebDriverWait(driver, 10)
wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, ".table-bordered"))
)
bodyStr= driver.find_element_by_tag_name("table").get_attribute("innerHTML")
print bodyStr
UnisandK
2016-04-07 19:09:39 +08:00

浏览器清了 cookie 刷新就这效果,请求里没看到特殊的东西,应该先是根据 IP 来的

那破玩意还是加了密的。。实质是一个跳转


要爬的话,你在服务器上装个 node.js 来获取 yundun=后边的参数吧。。
odirus
2016-04-07 19:15:52 +08:00
@popok 恩恩,谢谢。主要是我这边一直提示的 HTTP CODE = 521
odirus
2016-04-07 19:18:01 +08:00
@UnisandK 我这边主要是提示 521 错误。。
UnisandK
2016-04-07 19:25:25 +08:00
@odirus 521 返回的就是中间那一串加密了的 JS ,实质上就是一句跳转,主要目的是确认你有 JS 的执行环境,以此来剔除爬虫。。
odirus
2016-04-07 19:54:29 +08:00
@UnisandK 手动感谢。
odirus
2016-04-07 19:57:17 +08:00
@binux 咨询一下,为什么我执行 "curl -H 'Accept-Encoding:gzip' http://www.kuaidaili.com"后,对方有时返回原文、有时是 gzip 格式呢?是对方没遵守 HTTP 相关协议,还是我自己忽略了什么?谢谢


@popok
@naomhan
@binux
@gimp
@UnisandK

受益匪浅,不胜感激。
sohoer
2016-04-07 20:14:03 +08:00
521 不是标准的 http status code ,是他自定义的,
浏览器会把他当成 200 解析

还是 Fiddler 好, chrome 、 ie 都看不到那段 js 加密跳转代码
popok
2016-04-07 20:34:37 +08:00
@odirus 他好像确实没遵守协议,不管请求有没有 gzip ,他返回的都是 gzip 压缩过的,至少我随便试了下是这样的
sohoer
2016-04-07 20:39:51 +08:00
JAVA API HttpURLConnection 还不支持 521 拿不到那段源码
binux
2016-04-07 21:20:36 +08:00
@odirus Accept-Encoding:gzip 并不表示对方一定得返回 gzip
chinvo
2016-04-07 21:24:14 +08:00
解析或执行这段 js ,取得 cookie ,重爬
sohoer
2016-04-07 21:38:32 +08:00
更正一下,看了半天源码发现有 API
Status >= 400 时可以通过 HttpURLConnection getErrorStream() 获取 InputStream;
odirus
2016-04-08 09:02:49 +08:00
@sohoer 恩,感谢。以前一直不知道 HTTP CODE 规范的意义,现在遇到浙西问题才恍然大悟,没有规矩不成方圆。
@binux 恩,谢谢,明白了。
@chinvo 恩,谢谢,之前在本地执行这段 js 的时候没明白啥意思。谢谢。

@sohoer 很有专研精神, 3Q
killerv
2016-04-08 11:05:47 +08:00
这个网站的代理坑爹的,以前花钱买过,代理基本上 90%都不能用
LinJunzhu
2016-05-23 23:59:15 +08:00
@odirus 你好,能请教下关于这个网站的爬取么?

521 后如何能够拿到 yundun 后的参数呢?

使用的是 Scrapy 框架

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/269337

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX