记录⽤webscraper爬取裁判⽂书⽹的⽂书列表信息以及批量下载word⽂书这个是⼀位⽹友在B站交流的⼀个问题,这⾥记录⼀下。
需求
curlyginger皮具
1、爬取的⽹站地址:
2、需要抓取的信息
爬取⽂书列表内容,报告标题、⽂号、⽇期、摘要等等信息。
3、需要抓取多页,⽐如说前10页。
分析⽹站的情况
1、抓取的页⾯翻页的时候,url是不会变的。⽽在页⾯的源码当中⼜不到内容,说明⽹页是通过异步加载的。
2、打开F12,就会弹出下⾯的暂停提⽰,阻⽌后续的查看。没事,点击右下⾓的取消断点,再运⾏即可。
3、点击“network”,点击⽹页的第⼆页,查看请求的数据。
可以看到,是post请求,后⾯需要有⼀堆的参数
⼀般⽽⾔,通过这样请求之后,可以获取到真实的json⽂件,⾥⾯就包含了⽹页中⽂书的列表当中,然⽽这次却是不⼀样,请求得到的居然是加密的信息,还需要通过⼀定⽅式来进⾏解密才⾏。
到这⾥,已经可以感受到⽹页开发⼈员的“苦⼼”,反爬的措施可谓是⾮常的多。不过,我还是在⽹上到了⼀篇⽹友关于⽤python解决这上⾯问题的办法和代码,有需要的时候可以参考⼀下。这⾥有些内容在⾃⼰的能⼒圈之外,就暂时不考虑了。
web scraper爬取
⽤python⽐较复杂的话,那么就考虑⽤web scraper来试试。
python爬取的效率当然⾼,但是反爬的太厉害了,⼤部分的⽹站都会对python进⾏⼀定的限制和爬取,这样写代码的成本就⽆形增加了很多。
web scraper则不⽤考虑这么多,只要浏览器⾥⾯能看到数据,就能够进⾏爬取。
回头看看⽹站的情况:⼀是url不变,⼆是数据不在⽹页源码当中。那么就考虑“动态加载进⾏翻页”的这种情况(参考教程:
conversation的中文意思
主要配置如图:
关键点就是"selector type"和"click selector"的配置
"selector type"(⽤于选择⽹页中的⽂书列表)选择"Element click"
python教材下载"click selector"(⽤于翻页)这⾥需要注意,⼀般如果是直接在⽹页点选的话,得到的css代码是这样的.left_7_3 a:nth-of-type(n+2)
表⽰的意思就是从第⼆个翻页器(上⼀页为第⼀个,1为第⼆个)开始点击,⼀直到最后⼀个。
因为这个url有⾮常多的页,⽐如,如果希望只取前5页的话,可以如下更改:
.left_7_3 a:nth-of-type(-n+6)
织梦网论坛n的取值是从0开始的。
然后再在这个选择器下⾯,配置标题、⽂号、⽇期、摘要的选择器。
最终的结构图就是这样的:
爬取的过程及结果就是这样的。
这个⽅法相对python⽽⾔,节省的时间可不⽌⼀点点,结果基本上⼀致。
这⾥把上⾯的web scraper的配置也分享⼀下:
{"_id":"caipan","startUrl":["v/website/wenshu/181217BMTKHNT2W0/index.html?pageId=7bcf3b0574e320a487ada1f504759be4&s21=%E8%B5%94%E5%81%BF"],"selectors":[{"id":"list","type":"SelectorElementClick","pa 批量下载word⽂书
每个⽂书都提供有word下载的链接,但是实现批量下载还是有⼀点困难。
1、word的下载链接直接在按钮或者⽹页源码⾥⾯是提取不到的,是需要根据⽂书的url中的"docId"参数来构造的,即
“v/down/one?” + docID地址
例如:
爬取到的⽂书的详细页地址为:
v/website/wenshu/181107ANFZ0BXSK4/index.html?docId=f9ffb134f0cb4a2ab832abea01298704
那么下载地址就是:
v/down/one?docId=f9ffb134f0cb4a2ab832abea01298704
2、有了这个地址之后,原本以为可以直接⽤迅雷、IDM等软件来批量下载,但是很显然,⽹站的开发⼈员限制了。经过不同⽅法的验证,发现⽬前只能是通过浏览器来挨个下载。(另外,可能可以通过python设置各种反爬的⽅法来实现批量下载的⽬的,但是⼯程量⽐较⼤,我没试验成功,理论上应该是可的。)
那么就⽤了最笨的⽅法,借助python来模拟⿏标键盘的操作,将url批量的输⼊到浏览器当中,实现批量下载。
下⾯是单次下载的代码,批量的话只需要读取web scraper爬取的⽂件,构造好url,通过⼀个循环,依次输⼊下载即可。
import time
import pyautogui
time.sleep(1)
url_position = (160, 50) #url位置
def input_id(x,y,url): #输⼊url的动作
netcore开发androidpyautogui.click(button='left')
time.sleep(0.5)
div的描述
time.sleep(0.5)
pyautogui.press("enter")
url1 = "v/down/one?docId=694b012a59e34ae19967abeb00d512dc"
input_id(url_position[0],url_position[1],url1)
⼩结:
1、python固然很强⼤,但是有时候⽤web scraper可以效率更⾼,节省更多的时间。
2、web scraper爬取url不变、异步加载的⽹页,关键是"selector type"和"click selector"的配置,可以参考教程:
3、python可以通过pyautogui库,来实现⾃动化操作任意⿏标、键盘的操作。