网页抓取解密( 将永恒君的百宝箱设为星标精品文章(二):关于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='left')<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的例子
欢迎交流!