请教 V 友一个爬虫相关的问题

2018-03-21 14:49:10 +08:00
 yangzhezjgs
药监局网站
http://app2.sfda.gov.cn/datasearchp/gzcxSearch.do?formRender=cx&page=1

有需求需要从药监局网站抓取一点数据,发现药监局网站反爬虫无法破解(返回 202,无法抓到正确的 html),想求教一下各位大佬有没有解决办法?

已经尝试过的方法:
1.requests + fake_useragent
2.PhantomJS + selenium
3.requests_html 的 render() (pyppeteer+Chromium)
7076 次点击
所在节点    Python
23 条回复
scriptB0y
2018-03-21 15:07:09 +08:00
你要弄清反爬的点在哪里,哪个 header 是必须的,不然你换来换去什么都没用
yangzhezjgs
2018-03-21 15:19:31 +08:00
@scriptB0y 感谢回复。。问题是我就没弄明白他反爬的机制是什么。。。返回状态码 202 我还是第一次遇到
scriptB0y
2018-03-21 15:45:26 +08:00
@yangzhezjgs HTTP 状态码一般都没有什么意义,有的返回给你 200,但实际上页面没有内容,这取决于具体网站的实现,没什么太大意义。

你需要模拟出来这个 HTTP 请求,然后测试一下不加什么 header 会被阻止,你就知道哪个 header 是必须的了。然后你看看怎么在代码中获得这个 header 的
yangzhezjgs
2018-03-21 15:57:54 +08:00
@scriptB0y 老哥,问题在于他并不是根据请求 header 来做判断,而是他是中间通过 js 做了一次或者多次跳转,而不是简单的通过一次请求的 header 来判断。
返回的 202 只是一个中间状态,之后还有跳转,最后还是返回 200,但是中间这个过程我找不到办法模拟
manzhiyong
2018-03-21 16:06:28 +08:00
用 webdriver 调 chrome 试试
yangzhezjgs
2018-03-21 16:14:05 +08:00
@manzhiyong 理论上来说 Pyppeteer 就是调用 chrome/chromium
https://github.com/miyakogi/pyppeteer
opengps
2018-03-21 16:37:48 +08:00
ua,reffer 完全按照浏览器里的填写
scriptB0y
2018-03-21 16:52:02 +08:00
@yangzhezjgs 你先拿到 202 这个状态的结果,后一个跳转的目的地肯定是通过这个结果计算出来的吧,然后如果再跳转那你就继续看看,我遇到过的情况一般都这种 js 都可以模拟出来的。 除非某个地方的 js 通过加密计算需要一个 token,那就只能用浏览器执行这段 js 了。
yangzhezjgs
2018-03-21 16:52:55 +08:00
@opengps 这种方法我之前尝试过了。。。并没有用
yangzhezjgs
2018-03-21 16:56:56 +08:00
@scriptB0y 这个我也想过,但是他做了加密,202 的返回结果类似乱码,并不是真实的 js 代码....我 copy 下来保存为 html,在浏览器里打开也是空白....
brightguo
2018-03-21 17:16:13 +08:00
我来爬爬爬看,验证下你说的方法~~~稍等
yangzhezjgs
2018-03-21 17:18:52 +08:00
@brightguo 欢迎欢迎。。跪求解决方法
manzhiyong
2018-03-21 17:35:10 +08:00
from selenium import webdriver

url = "http://app2.sfda.gov.cn/datasearchp/gzcxSearch.do?formRender=cx&page=1"
driver = webdriver.Chrome()
driver.get(url)
print driver.page_source

我这是正常的
brightguo
2018-03-21 17:40:12 +08:00
+1

driver = webdriver.Chrome()
driver.get(url)
html = driver.page_source

可以
yangzhezjgs
2018-03-21 17:42:04 +08:00
@brightguo
@manzhiyong
等我试试。。。没试过用 chrome
Arrowing
2018-03-21 17:45:00 +08:00
会不会掉蜜罐里了?
goofool
2018-03-21 17:49:20 +08:00
chrome 默认配置可以
headless chrome 可以
phantomjs 默认配置不行
Itoktsnhc
2018-03-21 17:56:46 +08:00
目测是 cookie 的关系:
Cookie: JSESSIONID=C340BCBB36485013122B70B59E0B6A8A; FSSBBIl1UgzbN7N80S=GbBGB7f4oP98rH7eXqhUFWb8PraboCvvQXAinlgIcUXhi7Ov2KSFc0dWQz_zW6ah; FSSBBIl1UgzbN7N80T=1kZkIyFDq0P301zKjNjN0vzCd1x2Dk7s7khgO0Pl3eB0QvuYIgJ8M08UKApGxZHudaZwJMb.oTpIxWG5pgLxfaiAFvaj3JvQS1e.HYuPUEEHpzHfnSv0BvoKMQ50_EGSRlq9Ckj7r8dA0zybuc_CocLCuY20VgueYiHnURhsgHb0e5UDm3MevKP37CZ1iHRrtkkt2RFnMrduBwI7Uywge3hlRVIwAT9JVcBDg0FrMR0gF4_eHR1IW47QcUEDiZ4HyKNAQ.BqyRZH1W6dLcrqIZhWyyzIXkH_Ts4QmZ_EcCgXwR.DiSLxAxY9T8AyxDhiqB3Rk5HttJgOukIvAMJi.svxT1Y01dPJex0nAMyn7rivliq
xlrtx
2018-03-21 17:57:01 +08:00
如果有时间可以看下他的交互协议是怎样工作的, 推荐一个视频和播主, 他的逆向 JS 的思路很不错, 用到了函数 hook 很有意思.
<amp-youtube data-videoid="VcFQeimLH1c" layout="responsive" width="480" height="270"></amp-youtube>
Itoktsnhc
2018-03-21 17:58:12 +08:00
以及当 202 的时候返回响应里面:

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

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

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

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

© 2021 V2EX