前言
好久不更了,工作太忙- -入职不到两三个月,编程语言从Java跳C/C++,后来又需要爬虫,又去学了python,最近几日还在学vue...怎么说呢,往好听了说叫博学多识,往坏了说广而不专- -。 接下来我就对最近的爬虫工作做一个总结。
我要爬取的网站不方便贴出来,不过这是个老网站了,没有什么验证码那一类的反爬措施。要说麻烦在哪了的话,那就是小日本的编程逻辑了吧...请求参数命名随心所欲(从这一点上来看,是个外包公司没错了,听说日本好多来中国找外包,这个应该不是,因为我在JS里看到的注释是日文的),着实让人摸不着头脑。这些参数大多是纯英文,但是有那么一部分关键的参数命名是用的日文发音加英文写的。。。在他们的请求参数里,还有一个时间戳参数,你每一次请求都会更新时间戳,下一次的请求必须时间戳跟这个时间戳一摸一样。这个操作可以的,直接让我没办法用同一个账号的cookie多个服务器同时爬。
最坑的是,它只能通过IE访问,因为它是ActiveX做的,这是微软提供的一个IE插件,我爬虫的过程中好多问题都让我怀疑人生了,动不动页面就卡住动不了了。所以,我程序里日志和异常捕获做的特别多。。。
selenium的execute_script()
我一开始使用webdriver获取元素然后.click()做的点击事件,不知道是不是ActiveX的问题...所以,通通换成了用Js操作:
document.getElementById('Login').click()
而输入账号密码,用send_keys()仿佛又太慢了,干脆换成:
document.getElementById('XXX').value = 'SSM'
由于页面是动态加载的,所以在通过F12观察并拼接参数后,就开始访问对应的URL获取JSON(通过Python中的requests插件发送的请求),不过对有一部分URL的访问遇到了问题,没有报错,但是返回的JSON中缺少了我所需要的数据。于是突发奇想,干脆在页面上执行JS发送XMLHttpRequest请求获取数据好了,结果一试还真的就拿到了。但是XMLHttpRequest是异步的,获取后台数据后,会执行回调函数。所以突发奇想,用JS把数据都放到body标签的一个自定义的属性里,后面再获取这个属性就好了。以下,是我封装的方法:
def get_response_by_xml_request(driver, params, url, wait_time=1.5):
"