网页抓取解密( 将永恒君的百宝箱设为星标精品文章(二):关于webscraper爬取网页的问题)

优采云 发布时间: 2022-03-29 07:08

  网页抓取解密(

将永恒君的百宝箱设为星标精品文章(二):关于webscraper爬取网页的问题)

  

  将永恒之王的宝箱设为明星精品文章第一次看

  周末,勇勇军与B站网友就网络爬虫爬取网页进行了讨论交流。今天想跟大家分享一下,希望对大家有帮助。

  需要

  1、已爬网网站地址:

  %E8%B5%94%E5%81%BF

  2、需要抓取的信息

  爬取文献列表内容,上报标题、文献编号、日期、摘要等信息。

  

  3、需要爬多页,比如说前10页。

  分析网站的情况

  1、当翻页时,url不会改变。但是在页面的源码中找不到内容,说明页面是异步加载的。

  2、打开F12,会弹出如下暂停提示,阻止后续查看。没关系,点击右下角的取消断点,再次运行。

  

  3、点击“网络”,点击网页第二页,查看请求的数据。

  

  可以看到,是一个post请求,后面需要一堆参数

  

  一般来说,这样的请求后,可以得到真正的json文件,里面收录网页中的文档列表,但是这次不同,请求实际上是加密信息,需要通过一定的方法来解密.

  

  至此,你已经可以感受到网页开发者的“辛苦”了,反爬措施也不少。不过,我还是在网上找到了一位网友关于使用python解决这个问题的方法和代码。需要的时候可以参考。这里有些内容超出了自己的能力范围,暂时不考虑。

  网络刮刀

  如果用python比较复杂,那就考虑用web scraper试试。

  python爬取效率当然高,但是反爬太厉害了。大多数网站都会在一定程度上限制爬取python,所以写代码的成本会无形中增加不少。

  网络爬虫不需要想那么多,只要能在浏览器中看到数据,就可以爬取。

  回顾一下网站的情况:一是url不变,二是网页源码中没有数据。然后考虑“动态加载翻页”的情况。永恒之王之前写过这个教程:传送门在这里

  主要配置如图:

  

  重点是“选择器类型”和“点击选择器”的配置

  “选择器类型”(用于选择网页中的文档列表)选择“元素点击”

  这里需要注意“点击选择器”(用于翻页),一般如果直接点击网页,得到的css代码是这样的

  .left_7_3 a:nth-of-type(n+2)<br />

  意思是从第二个寻呼机(上一页为第一页,1为第二页)点击到最后一页。

  

  因为这个url有很多页面,比如你想只取前5个页面,你可以改成如下:

  .left_7_3 a:nth-of-type(-n+6)<br />

  

  n 的值从 0 开始。

  然后在此选择器下,配置标题、文档编号、日期和摘要的选择器。

  

  最终的*敏*感*词*如下所示:

  

  爬取过程及结果如下:

  

  

  与python相比,这种方法节省了不止一点时间,结果也基本相同。

  这里也分享一下上面网络爬虫的配置:

  {"_id":"caipan","startUrl":["http://wenshu.court.gov.cn/website/wenshu/181217BMTKHNT2W0/index.html?pageId=7bcf3b0574e320a487ada1f504759be4&s21=%E8%B5%94%E5%81%BF"],"selectors":[{"id":"list","type":"SelectorElementClick","parentSelectors":["_root"],"selector":"div.LM_list:nth-of-type(n+3)","multiple":true,"delay":0,"clickElementSelector":".left_7_3 a:nth-of-type(-n+4)","clickType":"clickOnce","discardInitialElements":"do-not-discard","clickElementUniquenessType":"uniqueText"},{"id":"title","type":"SelectorLink","parentSelectors":["list"],"selector":"a.caseName","multiple":false,"delay":0},{"id":"number","type":"SelectorText","parentSelectors":["list"],"selector":"span.ah","multiple":false,"regex":"","delay":0},{"id":"date","type":"SelectorText","parentSelectors":["list"],"selector":"span.cprq","multiple":false,"regex":"","delay":0},{"id":"content","type":"SelectorText","parentSelectors":["list"],"selector":"p","multiple":false,"regex":"","delay":0}]}<br />

  批量下载word文档

  每个文档都提供了word下载链接,但是要实现批量下载还是有点难度的。

  

  1、word的下载链接不能直接从按钮或网页源代码中提取。需要根据文档的url中的“docId”参数构造,即

  http://wenshu.court.gov.cn/down/one?” + docID地址<br />

  例如:

  爬取文档的详细页面地址为:

  http://wenshu.court.gov.cn/website/wenshu/181107ANFZ0BXSK4/index.html?docId=f9ffb134f0cb4a2ab832abea01298704<br />

  那么下载地址是:

  http://wenshu.court.gov.cn/down/one?docId=f9ffb134f0cb4a2ab832abea01298704<br />

  2、有了这个地址后,原本以为可以直接用迅雷、IDM等软件批量下载,但显然网站的开发者有限。不同方法验证后发现,目前只能通过浏览器一一下载。(另外,或许可以通过python设置各种反爬的方式来达到批量下载的目的,但是工程量比较大,我也没试过成功,理论上应该是可以的。 )

  然后我用了最笨的方法,用python模拟鼠标和键盘的操作,将url批量输入浏览器,实现批量下载。

  以下是单次下载的代码。批量只需要读取网络爬虫爬取的文件,构造url,通过循环依次进入下载即可。

  import time<br />import pyautogui<br /><br />time.sleep(1)<br />url_position = (160, 50) #url位置<br /><br />def input_id(x,y,url): #输入url的动作<br />    pyautogui.moveTo(x, y, duration=0.2)  #0.25表示完成移动的时间          <br />    pyautogui.click(button=&#39;left&#39;)<br />    time.sleep(0.5)<br />    pyautogui.typewrite(url,0.01)#输入字符,0.1表示输入每个字符间隔的时间<br />    time.sleep(0.5)<br />    pyautogui.press("enter")<br /><br />url1 = "http://wenshu.court.gov.cn/down/one?docId=694b012a59e34ae19967abeb00d512dc"<br /><br />input_id(url_position[0],url_position[1],url1)<br />

  总结一下:

  1、Python 功能强大,但有时使用网络爬虫会更高效,更节省时间。2、网络爬虫抓取url不变且异步加载的网页。关键是“选择器类型”和“点击选择器”的配置。可以参考永恒王者分享的教程:这里 3、python 可以通过 pyautogui 库来自动化任意鼠标键盘的操作。

  您可能还想看看:

  1、用 Python 爬取 28,010 条“隐藏的角落”评论,我发现了这些……

  2、python office - 面对大量扫描的文档,你还在一个个手动处理吗?

  3、python帮你快速读心文字4、使用python自定义web跟踪神器,有信息更新第一时间通知你(附视频演示)5、python实现浏览器自动化

  6、厌倦了重复动作?我们来看看这个python的例子

  欢迎交流!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线