Python简易爬虫

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

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

下面直接上代码:url

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()
    

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

相关文章
相关标签/搜索