Python简易爬虫
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python简易爬虫相关的知识,希望对你有一定的参考价值。
经常需要下载论文,每次都需要去网页上搜索,然后点击下载,实在麻烦,正好最近刚入门Python,心血来潮,想着写一个爬虫
经过一天查阅资料,基本算是完成了,但是还是不足,比如对知网和万方暂时还不行,但是对于英文文献是基本上没有问题的,思路就是在百度学术上进行搜索,拿到它搜索结果的第一个页面,然后把里面的下载链接全部爬下来,循环,进行判断,只要下载成功,就退出。但是对于少部分的外国文献库,知网和万方,他们是的下载链接是需要拿到百度学术搜索连接后,在把这个页面下的下载链接爬下来,这一点写个递归最好了,时间有限,这个问题等过几天再进行补充。
下面直接上代码:
import urllib import urllib.request import re import os #获得百度学术的第一个搜索结果 def baidusearch(key): #百度中的用是gbk编码,像Google中则是utf8编码,因此这里 #需要先编码 key=urllib.request.quote(key.encode(‘gbk‘)) url=‘‘‘http://xueshu.baidu.com/s?wd={}‘‘‘.format(key) response=urllib.request.urlopen(url) str1=response.read().decode(encoding=‘utf8‘) #匹配百度学术中的所有搜索结果 mat=re.compile(r‘href="/s\?wd=paperuri\S+"‘) str1=mat.findall(str1) #取出第一个搜索结果 #将前后的href和引号去掉 str1=str1[0][6:-1] #拼接为完整的路径 str1=r‘http://xueshu.baidu.com‘+str1 return str1 #获得搜索结果页面中的可用的下载链接 def getLink(key): response=urllib.request.urlopen(baidusearch(key)) str1=response.read().decode(encoding=‘utf8‘) #匹配真正的下载地址 mat=re.compile(r‘<a class="dl_item" \S+ \S+"‘) str1=mat.findall(str1) #去掉地址的前后多余信息 if str1: for i in range(len(str1)): str1[i]=str1[i][41:-1] #为了防止链接失效,这里返回所有可下载地址 return str1 #得到下载链接的响应报文头 def filesize(url): request=urllib.request.Request(url) response=urllib.request.urlopen(request) return dict(response.info()) #下载文件 def dFile(key,path=‘d:\\‘): li=getLink(key) if len(li): for dowpath in li: name=dowpath.split(‘/‘)[-1] try: if filesize(dowpath)[‘Content-Type‘]==‘application/pdf‘: print(‘将要从‘,dowpath,‘下载‘) #输出下载进度 def abk(a,b,c): per=a*b/c*100.0 if per>100: per=100 print(‘已完成:%.2f%%‘ %per) #开始下载 print(name) urllib.request.urlretrieve(dowpath,os.path.join(path,name),abk) break except: continue def main(): while True: key=input(‘请输入论文名,支持模糊搜索\n‘) path=input(‘请输入下载路径,例如:c:\,默认为D盘根目录\n‘) if len(path)==0: path=‘D:\\‘ print(‘开始下载\n‘) dFile(key,path) yn=input(‘下载完成,是否继续:y/n:‘) if yn==‘y‘: continue else: break #调试模块 if __name__==‘__main__‘: main()
这只是一个试验品。等过几天完善一下 在详细说明