python3.x + BeautifulSoup CSDN小爬虫

前言

很长一段时间里都想研究下爬虫,说到爬虫,大家比较推存的还是python,奈何第一语言不是python,使用Java做个一些练手后,感觉在解析网页内容上比较繁琐,带着拥抱变化的心态,最终撸完了python的相关基础知识。蹭着知识的新鲜和热乎劲,速度找了CSDN博客来发挥发挥,记录下来,鞭策和监督自己,与努力的小伙伴们共勉。

一.目标

根据指定用户名获取CSDN的博客文章详情,包括文章id,标题,正文,标签,阅读人数,是否原创,并且把数据保存到数据库中。

二.分析

欲善其事,先利其器,抓起数据第一步就是对待抓起数据的网页进行结构分析,步骤为:网页入口->跳转链接->待抓起页 。

三.获取目标链接

1.文章列表页

输入图片说明

2.获取列表页链接

输入图片说明
分析文章列表页代码,发现当前页所有文章都在一个class='article_list'的div下,故先获取此div,再获取里面所有的文章链接。

def getOnePageLinks(user, no=1):
    pageLinks=[]
    url = __rootUrl + '/' + user + '/article/list/' + str(no)
    html = urlopen(url)
    bsObj = BeautifulSoup(html)
    try:
        articleListObj = bsObj.find('div', {'id': 'article_list'})
        # 获取文章链接
        titleLinkLists = articleListObj.findAll('a', href=re.compile('[0-9]$'))
        for link in titleLinkLists:
            if link.attrs['href'] is not None:
                articleUrl = __rootUrl + link.attrs['href']
                if articleUrl not in pageLinks:
                    pageLinks.append(articleUrl)
    except BaseException as e:
        logging.error('get article link error:',e)

    return pageLinks

3.获取所有文章列表页链接

通过分析发现csdn博客文章列表页的地址格式为:${host}/用户名/article/list/index,根据索引的变化可获取所有的文章链接。

def getAllPageLinks(user):
    pageLinks = []
    index = 1
    while index > 0:
        print('index=' + str(index))
        tempPageLinks = getOnePageLinks(user, index)
        if(tempPageLinks is not None and len(tempPageLinks) > 0):
            index += 1
            pageLinks += tempPageLinks
        else:
            index = 0
    return pageLinks

四.目标页数据抽取

分析抓取页html格式,数据针对性抽取

def getTargetData(targetUrl):
    html = urlopen(targetUrl)
    bsObj = BeautifulSoup(html)
    bsInfoObj = bsObj.find('div',{'class':'container clearfix'})
    title = bsInfoObj.find('h1',{'class':'csdn_top'}).text
    original = bsInfoObj.find('div',{'class':'artical_tag'}).find('span',{'class':'original'}).get_text()
    time = bsInfoObj.find('div',{'class':'artical_tag'}).find('span',{'class':'time'}).get_text()
    view = bsInfoObj.find('ul',{'class':'right_bar'}).find('button').get_text()
    tagsObj = bsInfoObj.find('ul',{'class':'article_tags clearfix csdn-tracking-statistics'}).findAll('a')
    tagsList = []
    for value in tagsObj:
        try:
            tagsList.append(value.text)
        except Exception as e:
            logging.error(e)
    tarsStr = ','.join(tagsList)

    content = bsInfoObj.find('div',{'id':'article_content'}).get_text()

五.数据存储

def save(title, original, publishDate, view, tagsStr, content):
    cursor = connection.cursor()
    try:
        sql = 'INSERT INTO csdnblog (title,copyright,date,view,tags,content) VALUES (%s, %s, %s, %s, %s, %s)'
        cursor.execute(sql,(title, original, publishDate, view, tagsStr, content))
        connection.commit()
    except Exception as e:
        logging.error('execute sql',e)
    finally:
        cursor.close()

查看成果:
输入图片说明

源码获取

转载于:https://my.oschina.net/u/2402525/blog/1554297

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值