爬虫

记python爬虫坑2020年4月21日

python爬了小说更新的内容,转为本地txt文件,现需要通过一服务器API上传,但是多次提示: {"timestamp":"2020-04-20T17:21:01.457+0000","status":400,"error":"Bad Request","message":"Required request part 'file' is not present","path":"/upload"} 最后发现是由于我在headers中手动设置了Content-Type中的boundary的值和request请求时自动生成的请求表单中用来分隔不同参数的内容不一样。 Content-Type: multipart/form-data; boundary=9864967aa8b394b2f34e0b3a286c4118 这是我自己设置的⬆。 下图蓝色标注的的内容是不同点。 解决方案: 把headers中的 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryu2c0iGeMDDxPB7dd 删掉,request请求时会自动生成。 参考资料: https://blog.csdn.net/five3/article/details/7181521 https://blog.csdn.net/Enderman_xiaohei/article/details/89421773

使用正则表达式快速为请求头增加引号转为字典

在编写爬虫代码的时候,有些网站会验证访问的请求头可能导致无法爬到想要的数据。这里我们可以抓包到请求头,模拟正常的浏览器访问。 如果直接把抓包到的请求头粘贴在代码里面,肯定是不行的,因为这些字符串没有用引号引起来,手动改又太麻烦,所以这里我们可以用正则表达式(Re)来一键处理。 使用支持正则表达式替换的文本编辑器,例如Notepad++(也可以使用Sublime,只要支持正则表达式替换即可): 新建一个空的编辑框,把请求头复制进去。 进行替换 Ctrl+F进入查找窗口,然后单击替换进入替换选项卡。 “查找目标”设为(.*?): (.*),“替换为”设为"$1": "$2", 勾选“循环查找”和“正则表达式” 点击“全部替换” 替换结果

智慧山水助手更新v2.1

仓库地址 Github:https://github.com/imldy/health-data-post 更新内容 2020-04-13 Version:2.1 修改是否提交的判断逻辑为提取到提示信息进行判断 2020-04-12 Version:2.0 1. 提交内容更新。 2. 提交页面网址以及提交接口更新。 3. 从当前页面上获取日期以提交。

智慧山水平台每日自动提交健康数据——2.0提交数据修改

2020年4月12日更新了提交入口与提交接口,还修改了要提交的内容,特做一个小结。 修改需要提交的数据 本次新增的加粗显示,释义更新的以斜体显示。 新增“网页元素name”、“选项/数据获得方式”列 key 网页元素name 释义 选项/数据获得方式 id did 已经提交的表单的id。 如果是当天初次提交,id为空即可,会创建一个新的表单。 当天提交后再次访问提交页面,返回的页面中会包含一个隐藏的输入框,其value就等于当天上次提交表单的id。则如果修改已经提交的信息则提交时id为此值即可。1 fillDate ddate 当天日期 以年-月-日的格式,例如2020-04-12(Xpath: /html//input[@name="ddate"]/@value) mqjk question1 1.目前个人身体健康情况 参考每日健康记录页面(空)v2.0.html文件。最好去http://pubinfo.sdwcvc.cn/xxtb2/dailyRecord页面实际考察对应选项的value。1 jrjk question2 2.一起居住的家人身体健康情况 参考每日健康记录页面(空)v2.0.html文件。最好去http://pubinfo.sdwcvc.cn/xxtb2/dailyRecord页面实际考察对应选项的value。1 city1 question3_0 3.目前所在*位置*:省份 参考xxtb2_js_city.json文件,但是一定要实际使用APP去定位一次,使用定位来的数据提交,因为这个文件有些地区不对。1 city2 question3_1 3.目前所在*位置*:市 参考xxtb2_js_city.json文件,但是一定要实际使用APP去定位一次,使用定位来的数据提交,因为这个文件有些地区不对。1 city3 question3_2 3.目前所在*位置*:县区 参考xxtb2_js_city.json文件,但是一定要实际使用APP去定位一次,使用定位来的数据提交,因为这个文件有些地区不对。1 sfwc question5 5.今天是否有外出 参考每日健康记录页面(空)v2.0.html文件。最好去http://pubinfo.sdwcvc.cn/xxtb2/dailyRecord页面实际考察对应选项的value。2 sfjc question6 7.今日是否参加过聚集性活动或去过人员密集场所 0代表否,1代表是。要求数字。

智慧山水平台每日自动提交健康数据

因为2020年疫情的原因,学校让每位同学在家上课并且每天上报健康数据,但是我上报了几次觉得很麻烦并且容易忘掉,遂写了一个python程序,帮助提交身体健康数据[注1][注2]。 我已经使用了大约1个半月左右了,经历了几次版本迭代,目前可以实现多账户提交,这里分享下当时的思路,如有不当之处,请予指正,E-MAIL:i.ldy@qq.com。 目标 针对“智慧山水”APP的“每日健康上报”功能实现自动上报数据。 思路 大致思路: 获取提交数据的API 每天自动向学校服务器发送数据 第一步、确定提交的数据是以怎样的形式被传输到学校服务器的 因为学校是让我们下载了一个安卓APP,所以在这一步中,我使用了手机端的抓包软件(当然也可以使用更专业的PC端的抓包软件),访问提交信息的页面并填写提交了数据,抓包到了一个网址链接[注3]。 刚截的图,请忽略日期 抓包到的链接:http://pubinfo.sdwcvc.cn/Xxtb/dailyRecord?userid=我的学号 经测试,可以省略掉问号以及之后的内容。 PC端浏览器访问这个网址,跳转到了统一身份认证页面http://sso.sdwcvc.cn/(当时学校第一次启用智慧山水APP,所以我这里猜测是学校平台的PC端,后证实确实是),可以登录自己的账号。我当时为了速度,就使用了手机验证码登录。 登录账号后跳转到了 智慧校园综合服务门户http://portal.sdwcvc.cn/,我看到了与手机端类似的功能按钮与设计,但是并没有提交信息的入口,仅存的“健康上报管理”按钮还是灰色的。 刚截的图,可能跟当时不一样 尝试使用浏览器的“检查”功能,没有找到入口链接,所以我尝试再一次访问之前抓包到链接,这次可以正常查看提交信息的页面,发现原来就是提交页面,而且上边显示我今天已经提交。 我试着点击了“我要修改”,发现来到了正式的提交页面。之后我查看网页源代码,发现因为当天已经提交了,所以正式页面需要点击一次按钮才能被显示。如果当天未提交,则服务器返回的网页不会提示已经上报,这点可以作为当天初次提交还是修改的依据。 刚截的图,请忽略日期 然后我开启了浏览器“检查”功能,打开NetWork选项卡,点击了网页的“提交修改”的按钮,发现抓包到了个好东西。 刚截的图,请忽略日期,打码的红色是个人隐私信息 GET方式的请求,且Request URL是键值对的形式传输了数据,不难猜到这就可能就是传输的健康信息。 链接(已脱敏): http://pubinfo.sdwcvc.cn/Xxtb/saveRecord?id=924680&mqjk=%E5%81%A5%E5%BA%B7&jrjk=%E5%81%A5%E5%BA%B7&city1=%E5%8C%97%E4%BA%AC&city2=%E5%8C%97%E4%BA%AC&city3=%E5%8C%97%E4%BA%AC&sfwc=0&sfjc=0&sfhb=0&zb=%E4%B8%8D%E6%B8%85%E6%A5%9A&jchz=%E5%90%A6&other=%E8%BD%BB%E5%BE%AE%E5%92%B3%E5%97%BD%EF%BC%8C%E4%B8%8D%E5%8F%91%E7%83%AD%EF%BC%8C%E6%8B%BF%E4%BA%86%E8%8D%AF%E3%80%82 然后我们鼠标向下滑动,发现了浏览器已经帮我们做了解码。 为了避免服务器端接受信息产生歧义,url通常会被浏览器进行编码,所以这里我们看到的了好多%这样的url。 试着手动复制url到浏览器地址栏并访问,返回了这样的数据。 由此可以确定这就是我想要找到的接口。 第二步、编写代码 拿到了数据接口,开始用Pyhon写爬虫程序。 第一个版本是完全没有封装、没有优化,仅仅只有提交信息的功能。身体健康信息是用一个字典变量进行保存的,而且是写死在了代码里面。请求头数据使用的是浏览器抓包到的Request Heades信息。 登录获取Cookie 试了几次提交我发现Cookie的可用时间比较短,PC端退出了就失效了,于是我尝试每次登录获取Cookie然后再提交信息,于是我去了网站登陆页面 智慧校园综合服务门户http://portal.sdwcvc.cn/。 发现了三种登录方式。 后两种都不能实现无人值守,所以我决定使用用户名(学号)登录。 模拟发送登录请求获取Cookie 与上边抓包获得数据提交的接口同理,这次输入完用户名和密码后,点击登录之前要先打开浏览器的“检查功能”,切换至“NetWork”选项卡,然后再点击登录,会发现已经成功登录,并抓包成功,且浏览器跳转到了“智慧校园综合服务门户”页面 可以发现,发送请求使用的POST方式,并获取到了url:http://sso.sdwcvc.cn/index.php?rid=verifyWebUser 滑动至Headers选项卡最下面,找到了发送的数据。 经测试,仅需使用username用户名(学号)和password密码两项即可登录。 从登录到提交中间时间保持登录状态,我使用的方法是创建一个requests.session()实例对象,使用这个实例对象进行登录以及提交健康数据。 实际过程中我还请求了提交页面,查看当天是否已经提交成功了。 传输的信息中key的含义 我尝试修改了提交的信息,查看了网页源码,经过多次验证确定了每个key的含义 url中的每个key的解释如下 key 含义 id 表单id,如果是当天初次提交,id为空即可,会创建一个新的表单。当天提交后再次访问提交页面,返回的页面中会包含一个隐藏的输入框,其value就等于当天已经提交表单的id(Xpath:/html//input[@name="did"]/@value)。如果修改已经提交的信息则提交时id为此值即可。 mqjk 1.目前个人身体健康情况 jrjk 2.