1
popok 2016-04-07 18:46:23 +08:00
什么问题?
频率限制还是什么的?? 这网站默认 gzip |
2
popok 2016-04-07 18:48:51 +08:00 2
这个 yundun 只是一个 cdn 而已吧,你抓不到明文数据应该就是返回的数据都是 gzip 压缩的,你本地再解压一下,就能处理了
|
3
naomhan 2016-04-07 18:49:11 +08:00 1
没有吧 我记得 kuaidaili 很好爬的
|
4
binux 2016-04-07 18:56:15 +08:00 1
使用 phantomjs 没有问题
|
5
gimp 2016-04-07 19:08:23 +08:00 1
#!/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 |
6
UnisandK 2016-04-07 19:09:39 +08:00 1
浏览器清了 cookie 刷新就这效果,请求里没看到特殊的东西,应该先是根据 IP 来的 那破玩意还是加了密的。。实质是一个跳转 要爬的话,你在服务器上装个 node.js 来获取 yundun=后边的参数吧。。 |
9
UnisandK 2016-04-07 19:25:25 +08:00 1
@odirus 521 返回的就是中间那一串加密了的 JS ,实质上就是一句跳转,主要目的是确认你有 JS 的执行环境,以此来剔除爬虫。。
|
11
odirus OP |
12
sohoer 2016-04-07 20:14:03 +08:00
521 不是标准的 http status code ,是他自定义的,
浏览器会把他当成 200 解析 还是 Fiddler 好, chrome 、 ie 都看不到那段 js 加密跳转代码 |
14
sohoer 2016-04-07 20:39:51 +08:00 1
JAVA API HttpURLConnection 还不支持 521 拿不到那段源码
|
16
chinvo 2016-04-07 21:24:14 +08:00 1
解析或执行这段 js ,取得 cookie ,重爬
|
17
sohoer 2016-04-07 21:38:32 +08:00 1
更正一下,看了半天源码发现有 API
Status >= 400 时可以通过 HttpURLConnection getErrorStream() 获取 InputStream; |
18
odirus OP |
19
killerv 2016-04-08 11:05:47 +08:00
这个网站的代理坑爹的,以前花钱买过,代理基本上 90%都不能用
|
20
LinJunzhu 2016-05-23 23:59:15 +08:00
|
21
LinJunzhu 2016-05-24 13:41:41 +08:00
@UnisandK
你好,能麻烦请教下么? 我在获得 response 的 JS 代码后 ```javascript window.onload=setTimeout("by(242)", 200); function by(OG) {var qo, mo="", no="", oo = [0x0a,0x9a,0x4a,0x01,0x7c,0x13,0xb5,0x4f,0xfd,0x78,0x0f,0x27,0xd6,0xae,0x28,0xfe,0x95,0x50,0x98,0xe8,0x15,0xa7,0x9d,0xd7,0x88,0x1f,0x18,0xf0,0x67,0x3e,0x19,0x33,0xac,0x3b,0x09,0x99,0x87,0x60,0xb5,0x70,0xe7,0x3d,0x85,0x40,0x90,0x08,0xf8,0x66,0x07,0x35,0xb0,0xde,0x17,0x2f,0x27,0xfe,0xd6,0x88,0xf5,0xe7,0xdc,0xea,0x62,0x34,0x01,0xd1,0x7f,0xd0,0x19,0x22];qo = "qo=68; do{oo[qo]=(-oo[qo])&0xff; oo[qo]=(((oo[qo]>>2)|((oo[qo]<<6)&0xff))-99)&0xff;}while(--qo>=2);"; eval(qo);qo = 67; do { oo[qo] = (oo[qo] - oo[qo - 1]) & 0xff; } while (-- qo >= 3 );qo = 1; for (;;) { if (qo > 67) break; oo[qo] = ((((((oo[qo] + 198) & 0xff) + 204) & 0xff) << 5) & 0xff) | (((((oo[qo] + 198) & 0xff) + 204) & 0xff) >> 3);qo++;}po = "";for (qo = 1; qo < oo.length - 1; qo++) if (qo % 6) po += String.fromCharCode(oo[qo] ^ OG);po += "\""; eval("qo=eval;qo(po);");} ``` 那这里该如何去解析拿到 yundun 的 id 呢? |
22
odirus OP @LinJunzhu 我没用过 Scrapy 呢,我用的是 selenium + PhamtomJS ,
那段 JavaScript 代码其实就是重定向的代码,但是我没找到在 Python 中执行 JavaScript 合适的轮子,所以就直接用 PhamtomJS 执行这个页面,当然也会自动运行 JavaScript 代码,然后我就到真实页面了。 但是我发现这个代理网站很糟糕,所以我就发现了另外一个网站, http://www.freeproxylists.net/。如果你爬这个网站的时候遇到机器人验证,你也搞不定的话,可以再问。 |