Python爬虫请教:如何解决爬虫相关问题?

药监局网站
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)
Python爬虫请教:如何解决爬虫相关问题?


23 回复

你要弄清反爬的点在哪里,哪个 header 是必须的,不然你换来换去什么都没用


我无法理解你的问题。

感谢回复。。问题是我就没弄明白他反爬的机制是什么。。。返回状态码 202 我还是第一次遇到

HTTP 状态码一般都没有什么意义,有的返回给你 200,但实际上页面没有内容,这取决于具体网站的实现,没什么太大意义。

你需要模拟出来这个 HTTP 请求,然后测试一下不加什么 header 会被阻止,你就知道哪个 header 是必须的了。然后你看看怎么在代码中获得这个 header 的

老哥,问题在于他并不是根据请求 header 来做判断,而是他是中间通过 js 做了一次或者多次跳转,而不是简单的通过一次请求的 header 来判断。
返回的 202 只是一个中间状态,之后还有跳转,最后还是返回 200,但是中间这个过程我找不到办法模拟

用 webdriver 调 chrome 试试

理论上来说 Pyppeteer 就是调用 chrome/chromium
https://github.com/miyakogi/pyppeteer

ua,reffer 完全按照浏览器里的填写

你先拿到 202 这个状态的结果,后一个跳转的目的地肯定是通过这个结果计算出来的吧,然后如果再跳转那你就继续看看,我遇到过的情况一般都这种 js 都可以模拟出来的。 除非某个地方的 js 通过加密计算需要一个 token,那就只能用浏览器执行这段 js 了。

这种方法我之前尝试过了。。。并没有用

这个我也想过,但是他做了加密,202 的返回结果类似乱码,并不是真实的 js 代码…我 copy 下来保存为 html,在浏览器里打开也是空白…

我来爬爬爬看,验证下你说的方法~~~稍等

欢迎欢迎。。跪求解决方法

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

我这是正常的

+1

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

可以



等我试试。。。没试过用 chrome

会不会掉蜜罐里了?

chrome 默认配置可以
headless chrome 可以
phantomjs 默认配置不行

如果有时间可以看下他的交互协议是怎样工作的, 推荐一个视频和播主, 他的逆向 JS 的思路很不错, 用到了函数 hook 很有意思.

<iframe src="https://www.youtube.com/embed/VcFQeimLH1c" class="embedded_video" allowfullscreen="" type="text/html" id="ytplayer" frameborder="0"></iframe>

以及当 202 的时候返回响应里面:

不好一次 ctrl +enter 手误 提交了
接上条
<script type=“text/javascript”>window.onload=function(){var $rU=document.getElementById($f7(‘ondoal’));$cc($rU.name,$tY($rU,_$zo(‘mdpf2UXqQG’)));};</script>
看起来是写入了 Cookie ?
同时返回的 html 中有个<meta>

方便贴个链接吗

回到顶部