10分钟教你⽤Python爬取Baidu⽂库全格式内容
前⾔
本⽂的⽂字及图⽚来源于⽹络,仅供学习、交流使⽤,不具有任何商业⽤途,版权归原作者所有,如有问题请及时以作处理。
作者:向柯玮,周航 程序猿声
PS:如有需要Python学习资料的⼩伙伴可以加点击下⽅链接⾃⾏获取
考虑到现在⼤部分⼩伙伴使⽤Python主要因为爬⾍,那么为了更好地帮助⼤家巩固爬⾍知识,加深对爬⾍的理解,我们⼩组选择了爬取百度⽂库作为我们的⼤作业。
TXT,DOCX爬取与保存
在爬取任何东西之前,我们都要先确认需要爬取的数据是不是异步加载的。如果是异步加载的直接爬取⽹页是爬不到的。
要知道是不是异步加载其实很简单,就⽤request对⽹页发起请求,看看response是什么就可以了。
url ='wenku.baidu/view/4e29e5a730126edb6f1aff00bed5b9f3f90f72e7.html?rec_flag=default'
header ={'User-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'}
res = (url , headers = header)
<
很明显,返回的东西,并不是我们所需要的内容。根据常理来说,我们就可以认为该⽹页是异步加载的。
但是,从常识来讲,如果⽹页的内容是异步加载的,那么直接通过百度搜索,是搜索不到⽹页内部的内容的,但是很显然,我们每次通过百度搜索都是可以直接到⽂库中的⽂本内容的。如下:
那么这就有意思了,明明直接发起请求是获取不到⽹页内容的,但是为什么通过百度搜索就可以到呢?
getsavefilename关键肯定在于百度搜索上⾯。这个时候通过查阅资料,我们了解到,最主要的问题出在我们的headers。
在爬取⽹页时,headers通常是作为⾝份证,让⽹页不看出我们是爬⾍。如果不加headers,⽹页直接就会看出我们是爬⾍,就会拒绝访问。
再深⼊了解以下headers的识别机理,我们发现了叫做Robot协议的东西。
它规定了什么样的headers可以访问⽹页内部内容,除了指定headers之外的headers,都是⽆法请求页⾯内容的。(更详细的Robot协议介绍以附件形式给出)
⽐如说百度⽂库的Robot协议就是下⾯这样的。
User-agent: Baiduspider
Disallow:/w?
Disallow:/search?
Disallow:/submit
Disallow:/upload
Disallow:/cashier/
⽽我们需要爬取的内容url格式为
wenku.baidu/view/?.html
这代表Baiduspider应该可以爬取⽂库内容。⼤致猜测这是因为百度搜索时需要根据⽂本内容匹配搜索选项,所以放⾏。
因此我们尝试伪装User-agent为Baiduspider。
url ='wenku.baidu/view/4e29e5a730126edb6f1aff00bed5b9f3f90f72e7.html?rec_flag=default'
header ={'User-agent':'Googlebot'}
res = (url , headers = header)
<
果然不出所料,我们成功地获取到了⽬标内容。
既然已经成功获取到了⽹页的正确源代码,那么下⼀步就是去解析⽹页获取内容。
解析⽹页源代码的库有很多,这⾥我们使⽤BeautifulSoup。
plist =[]
soup = BeautifulSoup(r,"html.parser")
plist.append(soup.title.string)
for div in soup.find_all('div', attrs={"class":"bd doc-reader"}):
<_text().split('\n'))
plist =[c.replace(' ','')for c in plist]
plist =[c.replace('\x0c','')for c in plist]
plist
整个解析是⾮常容易的,都是很标准的操作。在这⾥就不多加叙述了。最终的效果如下。
当然爬取到东西了只是万⾥长征的第⼀步,就这样是肯定不⾏的,我们还需要将爬取的内容保存起来,通常是保存为txt⽂件。
file=open('','w',encoding='utf-8')
for str in plist:
file.write(str)
file.write('\n')
file.close()
但是为了美观起见,我们在这⾥选择使⽤python-docx库将内容保存为docx⽂件。
with open('', encoding='utf-8')as f:
docu = Document()
docu.add_ad())
docu.save('test.docx')
PPT,PDF爬取与保存
有了之前的经验教训,在爬取的时候我们⾸先就尝试了使⽤爬取TXT,DOCX的⽅法,尝试是否可以爬到内容。
url ='wenku.baidu/view/a4ac1b57dd88d0d232d46a0f.html?fr=search'
header ={'User-agent':'Googlebot'}
res = (url , headers = header)
<
很可惜的是,我们并没有访问到。原因仔细想想也很简单,在百度搜索的时候,直接搜索是搜不到PPT或者PDF的内容的。
那么很显然,PPT和PDF是通过异步的⽅法进⾏内容加载的。
对待异步加载的数据,我们通常采取的策略有两种,第⼀个就是直接到发起异步请求的接⼝,⾃⼰构造请求头,发起请求,第⼆个就是通过Selenium这样的⾃动化测试⼯具去爬取。
百度⽂库的接⼝太难了,请求头的构造也很⿇烦,了很久也没有很满意。所以在本次爬取中,我们使⽤的是第⼆种⽅法,使⽤Selenium这样的⾃动化测试⼯具。
在这⾥不多加介绍WebDriver,有兴趣的⼩伙伴可以⾃⼰查⼀下,我们直接上⼿使⽤。
这⾥我们需要下载ChromeDriver这个插件,当然这⾥是默认⼤家使⽤的是Chrome浏览器,如果是其他的浏览器,firefox,safari等等,直接去⽹上到相应Driver就可以了。
这⾥给出ChromeDriver的下载地址:
/mirrors/chromedriver/
⼤家⼀定要下载和⾃⼰Chrome浏览器版本⼀致的ChromeDriver,不然程序是运⾏不起来的。
我们先不急着马上开始爬取,我们先来尝试使⽤⼀下Selenium调⽤ChromeDriver。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论