首页 > 代码库 > Python简易爬虫

Python简易爬虫

经常需要下载论文,每次都需要去网页上搜索,然后点击下载,实在麻烦,正好最近刚入门Python,心血来潮,想着写一个爬虫

经过一天查阅资料,基本算是完成了,但是还是不足,比如对知网和万方暂时还不行,但是对于英文文献是基本上没有问题的,思路就是在百度学术上进行搜索,拿到它搜索结果的第一个页面,然后把里面的下载链接全部爬下来,循环,进行判断,只要下载成功,就退出。但是对于少部分的外国文献库,知网和万方,他们是的下载链接是需要拿到百度学术搜索连接后,在把这个页面下的下载链接爬下来,这一点写个递归最好了,时间有限,这个问题等过几天再进行补充。

下面直接上代码:

import urllibimport urllib.requestimport reimport 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(rhref="http://www.mamicode.com/s/?wd=paperuri\S+")    str1=mat.findall(str1)    #取出第一个搜索结果    #将前后的href和引号去掉    str1=str1[0][6:-1]    #拼接为完整的路径    str1=rhttp://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:                continuedef 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()    

这只是一个试验品。等过几天完善一下 在详细说明

Python简易爬虫