用爬虫来爬取csdn大神的文章的url

上一篇文章中爬虫来获取廖老师python教程的url并加入搜索url功能,这一篇文章会爬取csdn大神july的所有博客的url,并实现搜索功能就像下面这样

请输入你要查询的知识点:Machine
Machine L & Deep Learning
http://blog.csdn.net/v_JULY_v/article/category/1061301
Kaggle—So Easy!百行代码实现排名Top 5%的图像分类比赛:     http://blog.csdn.net/v_july_v/article/details/71598551
GAN之父在NIPS 2016上做的报告:两个竞争网络的对抗(含译文下载):     http://blog.csdn.net/v_july_v/article/details/60618425
如何从零起步学习AI:     http://blog.csdn.net/v_july_v/article/details/54561427
手把手教你搭建caffe及手写数字识别(Ubuntu下且附mac、纯通俗教程):     http://blog.csdn.net/v_july_v/article/details/53086367
教你从头到尾利用DQN自动玩flappy bird(全程命令提示,GPU+CPU版):     http://blog.csdn.net/v_july_v/article/details/52810219
基于torch学汪峰写歌词、聊天机器人、图像着色/生成、看图说话、字幕生成:     http://blog.csdn.net/v_july_v/article/details/52796239
没GPU也能玩梵高作画:Ubuntu tensorflow CPU版:     http://blog.csdn.net/v_july_v/article/details/52683959
教你从头到尾利用DL学梵高作画:GTX 1070 cuda 8.0 tensorflow gpu版:     http://blog.csdn.net/v_july_v/article/details/52658965
CNN笔记:通俗理解卷积神经网络:     http://blog.csdn.net/v_july_v/article/details/51812459
通俗理解LDA主题模型:     http://blog.csdn.net/v_july_v/article/details/41209515
从贝叶斯方法谈到贝叶斯网络:     http://blog.csdn.net/v_july_v/article/details/40984699
从拉普拉斯矩阵说到谱聚类:     http://blog.csdn.net/v_july_v/article/details/40738211
Adaboost 算法的原理与推导:     http://blog.csdn.net/v_july_v/article/details/40718799
最大熵模型中的数学推导:     http://blog.csdn.net/v_july_v/article/details/40508465
数据挖掘中所需的概率论与数理统计知识:     http://blog.csdn.net/v_july_v/article/details/8308762
从K近邻算法、距离度量谈到KD树、SIFT+BBF算法:     http://blog.csdn.net/v_july_v/article/details/8203674
[置顶]
        支持向量机通俗导论(理解SVM的三层境界):     http://blog.csdn.net/v_july_v/article/details/7624837
从决策树学习谈到贝叶斯分类算法、EM、HMM:     http://blog.csdn.net/v_july_v/article/details/7577684
[置顶]
        Machine Learning读书会,面试算法讲座,创业活动,算法班(1510月):     http://blog.csdn.net/v_july_v/article/details/7237351
数据挖掘领域十大经典算法初探:     http://blog.csdn.net/v_july_v/article/details/6142146

先观察一下网页源码

<ul class="panel_body">    
                 <li>
                    <a href="..." onclick="...">03.Algorithms(实现)a><span>(9)span>
                li>
                 <li>
                    <a href="..." onclick="...">01.Algorithms(研究)a><span>(27)span>
                li>
                 <li>
                    <a href="..." onclick="...">02.Algorithms(后续)a><span>(22)span>
                li>
                 <li>
                    <a href="..." onclick="...">04.Algorithms(讨论)a><span>(1)span>
                li>
                ...
ul>

或许你会用find(“div”, class_=”panel_body”)来得到想要的标签,但是这样就大错特错了,因为网页源码的其它部分也用了ul class=”panel_body”并且在其下面存放的并不是关于分类的文章的url。获取分类文章的url的代码

chapter_tag = url_soup.find_all("ul", class_="panel_body")[5]
'''
5是我自己一个一个试出来的,第六个
    标签下面的
  • 标签正好存放的是分类章节的url '''

根据博客文章的分类来计算总共需要多少个列表,并创建一个多维列表

L = []
count = 0
for i in chapter_tag.find_all("li"):
    count +=1
for i in range(count):
    L.append([])

获取了博客文章分类的url之后先把文章分类的名字以及url存储到列表的第一个位置就像这样[['Machine L & Deep Learning'], ['Algorithms(实现)'],...]

for i in chapter_tag.find_all("li"):
    text = i.find("a").get_text()
    '''
    获取的text是这样'04.Algorithms(讨论)'但是我们并不需要前缀
    '''
    handle_text = text.split('.')[1]
    L[sign].append(handle_text)
    chapter_url = 'http://blog.csdn.net' + i.find("a").get("href")
    L[sign].append(chapter_url)
    L_copy = L[sign]
    handler_chapter_url(chapter_url, L_copy)
    sign += 1

获取了文章分类的url之后,就要对url进行处理了(找到各个分类包含的所有文章的url)也不要忘了把当前使用的列表传入到url处理函数中。先观察一下跳转到文章分类中某一个分类的网页源码吧。(比如说进入到Algorithms(实现)这个的页面)

<div class="list_item article_item">
        <div class="article_title">   
         <span class="ico ico_type_Original">span>


    <h1>
        <span class="link_title"><a href="/v_july_v/article/details/6431001">
        十四、第三章再续:快速选择SELECT算法的深入分析与实现            
        a>
        span>

    h1>
div>

要用find_all(“div”, class_=”list_item article_item”).find_all(“span”)[1]来定位到文字叙述部分以及url部分。获取之后还要把文字叙述部分进行处理之后以及url储到列表中(存储到多维列表的哪一个位置就要看L_copy = L[sign]是在多维列表的哪一个位置了)

def handler_chapter_url(chapter_url, L_copy):
    chapter_url_html  = urllib.request.urlopen(chapter_url)
    chapter_url_soup = BeautifulSoup(chapter_url_html, 'html.parser')
    for n in chapter_url_soup.find_all("div", class_="article_title"):
        detial_tag = n.find_all("span")[1]
        '''
        对文字叙述部分进行处理,把换行符空白符啥的通通pass掉
        '''
        detial_name = detial_tag.get_text().replace('\n', '').replace('\s', '').strip()
        detial_url = 'http://blog.csdn.net' + detial_tag.find("a").get("href")
        L_copy.append(detial_name + ':     '  + detial_url)

所有关于url的操作已经完成了,接下来就要进行查询操作了。

def inquiry(s):
    for i in range(sign):
        if L[i][0].startswith(s):
            for j in range(len(L[i])):
                print(L[i][j])
        else:
            pass

根据输入的字符串来查找列表中存储的信息。最后是所有代码了。

import re
from bs4 import BeautifulSoup
import urllib.request

def inquiry(s):
    for i in range(sign):
        if L[i][0].startswith(s):
            for j in range(len(L[i])):
                print(L[i][j])
        else:
            pass

def handler_chapter_url(chapter_url, L_copy):
    chapter_url_html  = urllib.request.urlopen(chapter_url)
    chapter_url_soup = BeautifulSoup(chapter_url_html, 'html.parser')
    for n in chapter_url_soup.find_all("div", class_="article_title"):
        detial_tag = n.find_all("span")[1]
        detial_name = detial_tag.get_text().replace('\n', '').replace('\s', '').strip()
        detial_url = 'http://blog.csdn.net' + detial_tag.find("a").get("href")
        L_copy.append(detial_name + ':     '  + detial_url)

url = 'http://blog.csdn.net/v_JULY_v/article/details/6530142/'
html = urllib.request.urlopen(url)
url_soup = BeautifulSoup(html, 'html.parser')
chapter_tag = url_soup.find_all("ul", class_="panel_body")[5]
L = []
count = 0
for i in chapter_tag.find_all("li"):
    count +=1
for i in range(count):
    L.append([])

sign = 0
for i in chapter_tag.find_all("li"):
    text = i.find("a").get_text()
    handle_text = text.split('.')[1]
    L[sign].append(handle_text)
    chapter_url = 'http://blog.csdn.net' + i.find("a").get("href")
    L[sign].append(chapter_url)
    L_copy = L[sign]
    handler_chapter_url(chapter_url, L_copy)
    sign += 1

s = input('请输入你要查询的知识点:')
inquiry(s)

运行结果

请输入你要查询的知识点:TAOPP
TAOPP(编程艺术)
http://blog.csdn.net/v_JULY_v/article/category/784066
程序员编程艺术第四十一章~四十二章:荷兰国旗、矩阵相乘Strassen算法:     http://blog.csdn.net/v_july_v/article/details/18824517
程序员编程艺术第三十九~四十章:最近公共祖先LCA、打印螺旋矩阵:     http://blog.csdn.net/v_july_v/article/details/18312089
程序员编程艺术第三十八章:Hero在线编程判题、出题系统的演进与优化:     http://blog.csdn.net/v_july_v/article/details/17632221
...

关于用列表来存取信息这一部分讲的比较模糊,其实你只需要print一下列表,或许就会感觉我讲的就是个渣(还没有你自己理解的深入)。

你可能感兴趣的:(python爬虫)