如何利用Python爬虫爬取博主的全部文章的标题,文章标题的URL。可根据阅读量进行降序输出!

步履艰辛呀!自己不会做网络爬虫,只好去找教程例子!
当然自己也是有点小基础的!只是会读取简单的HTML网页代码!
对于这么复杂的代码,驾驭不住呦~
多个代码类型。我会分别列取出来的。
如果是代码的原作者,看到请联系我。我会标明来源地址的!
前言:
但是无论是谁的主页,都会出现这个人的主页。
已经有好多人都爬取到啦!
我爬取的所有链接的部分链接
在这里插入图片描述
但是,这个链接:https://blog.csdn.net/yoyo_liyy/article/details/82762601
是不存在的。只能访问他的主页!就看到下面这个文章啦!
在这里插入图片描述
下面来说说我的历程吧!
依照我历程顺序的三个爬虫实例:

  1. 爬取所有文章的标题,以及文章的阅读量,还有文章的阅读量总和!
  2. 不区分原创还是转载。爬取所有文章的链接
  3. 区分原创还是转载。爬取所有文章的链接

好,接下来直接上源代码:

1,爬取所有文章的标题,以及文章的阅读量,还有文章的阅读量总和!
但是统计数量会出错误!

import requests
import re
sum = 0
pages = 9
x = 1
nn = []
base_url = "https://blog.csdn.net/weixin_42859280/article/list/"
for x in range(pages):
    r = requests.get(base_url+str(x+1))
    titles = re.findall(r'<span class="article-type type-.*?">\n.*?</span>\n(.*?)</a>', r.content.decode(), re.MULTILINE)
    visits = re.findall( r'<span class="read-num">阅读数:(.*?)</span>', r.content.decode())
    nn.append(visits)
    nn = [int(x) for x in visits] #将阅读数转换为数字
    mm = nn[1:-1]
    for x, y in zip(titles, mm): #文章与阅读数组合
        if y<100:
            print(x, ": ",y)
        sum += y
print(sum)
print(visits)
print(mm)

代码截图:
在这里插入图片描述
运行结果:
在这里插入图片描述
我的访问量:62921
在这里插入图片描述
但是阅读量出现错误啦!因为开头说的那个文章啦。所以就错位了。
还有,访问量是大于阅读量的!
因为:访问量=别人访问你主页次数+阅读文章次数总和!
所以这个可以大概看一下吧!不是完美的!

2,不区分原创还是转载。爬取所有文章的链接
但是,不能区分原创,还是转载!
这个历程,也让我收获了一个志同道合的好友。
下面的那个代码也是这个代码的作者写的!
代码:

import urllib.request
from bs4 import BeautifulSoup
#如果没有安装好BeautifulSoup,这里是会报错的

#自定义一个函数拿到博客的链接
def getUrl (url):
    #定义一个headers,存储刚才复制下来的报头,模拟成浏览器
    headers = ('User-Agent',
               "Mozilla/5.0 (Windows NT 10.0; Win32; x32; rv:48.0) Gucko/20130101 Firefox/58.0")
    opener = urllib.request.build_opener()
    opener.addheaders = [headers]
    # 将opener安装为全局
    urllib.request.install_opener(opener)
    html = urllib.request.urlopen(url).read().decode('utf-8', 'ignore')

    bs = BeautifulSoup(html,'html.parser')
    # 用beautifulsoup的select,找到所有的<a>标签
    pages = bs.select(".pagination-box")
    if pages:
         # 判断是否包含下一页的选项
         # 用beautifulsoup的select,找到所有的<a>标签
         links = bs.select('.article-list > .article-item-box > h4 > a')
         return links
    else:
        sys.exit()

# 要爬取的网页链接
import  sys
if __name__ == '__main__':
    count = 0
    base_url = 'https://blog.csdn.net/weixin_42859280'
    # 要爬取的网页链接 ,循环足够多的页数,所以填了1000000
    for i in range(1,10):
        #https://blog.csdn.net/weixin_42859280/article/list/2?orderby=ViewCount
        url = base_url+'/article/list/'+str(i)+'?orderby=ViewCount'
        # 获取对应网页的链接地址
        linklist = getUrl(url)
        # 定义一个列表texts存储文章的标题
        texts = []
        # 定义一个列表links存储文章的链接
        links = []
        # 遍历linkllist,存储标题和链接
        for link in linklist:
            texts.append(link.text.strip())
            links.append(link.get('href'))
            #    通过zip,将信息输出到控制台
        print('\n')
        for text, link in zip(texts, links):
            text = text.strip().replace("原        \n        ", "")
            text = text.strip().replace("转        \n        ", "")
            data = {text,link}
            ff = open('原创_文章标题.txt','a')
            if count%10 ==0:
                ff.write(str(count)+text+'\n\n')
            else:
                ff.write(str(count)+text+'\n')
            ff.close()
            ff = open('原创_链接.txt','a')
            ff.write(link+'\n')
            ff.close()
            count+=1;
            print("成功! 有",count,'个完成!')
            #print(data)
#ff.close()


自己添加了一些写入的文件的操作:
跟爬虫有知识不同!
这个知识可以自行百度,挺简单的。
我的是在爬虫所在路径之下建立的文本文件,名字写入!
必须在同一个路径之下!才可以打开进行写入!
![在这1222303451.png)
就是打开记事本,写入,关闭!
我的写入用的是追加手法!不会覆盖!

 ff = open('原创_文章标题.txt','a')
            if count%10 ==0:
                ff.write(str(count)+text+'\n\n')
            else:
                ff.write(str(count)+text+'\n')
            ff.close()
            ff = open('原创_链接.txt','a')
            ff.write(link+'\n')
            ff.close()
            count+=1;
            print("成功! 有",count,'个完成!')

代码截图(一页放不下,两页来放呗!):
在这里插入图片描述在这里插入图片描述
运行结果截图:
在这里插入图片描述
文本截图:
在这里插入图片描述
但是,还有待优化!
我与原作者进行了联系!进行了交流~
下面就是目前最优化的版本啦!

3,区分原创还是转载。爬取所有文章的链接
但是,阅读数和评论数不对。变量不能进行更新。
总是和第一篇文章(就是前面说的那个,每个人首页都会出现的!)一样!

这次优化,进行区分了原创,转载,阅读数(未成功),评论数(未成功)
总体代码,没有进行改变。就是改变了一下链接
在这里插入图片描述
链接地址:

https://blog.csdn.net/weixin_42859280/article/list?t=1

我又进行了一些改变,可以进行顺序控制!
在这里插入图片描述
这个是第三页!
链接地址:

https://blog.csdn.net/weixin_42859280/article/list/3?t=1&orderby=ViewCount

完整代码:

import requests
from bs4 import BeautifulSoup

header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
}
def getOriginalArticle():
    '''获取原创文章'''
    for i in range(1,100):
        #https://blog.csdn.net/weixin_42859280/article/list/3?t=1&orderby=ViewCount
        #https://blog.csdn.net/weixin_42859280/article/list/2?orderby=ViewCount
        #url = base_url+'/article/list/'+str(i)+'?orderby=ViewCount'

        #url = 'https://blog.csdn.net/{}/article/list/{}?t=1'.format(username,i)
        url = 'https://blog.csdn.net/weixin_42859280/article/list/'+str(i)+'?t=1&orderby=ViewCount'
        web_data = requests.get(url, headers=header)
        soup = BeautifulSoup(web_data.content, 'lxml')
        pages = soup.select(".pagination-box")
        if pages:
            # 判断是否包含下一页的选项
            # 用beautifulsoup的select,找到所有的<a>标签
            links = soup.select('.article-list > .article-item-box > h4 > a')
            readnum = soup.select('.read-num')
            printOriginalData(links,readnum,'原        \n        ')
        else:
            # 结束循环
            break

def getTranshipmentArticle(username):
    '''获取转载文章'''
    for i in range(1,100):
        url = 'https://blog.csdn.net/{}/article/list/{}?t=2'.format(username,i)
        web_data = requests.get(url,headers=header)
        soup = BeautifulSoup(web_data.content, 'lxml')
        pages = soup.select(".pagination-box")
        links = soup.select('.article-list > .article-item-box > h4 > a')
        readnum = soup.select('.read-num')
        if pages:
            printTranshipmentData(links,readnum,'转        \n        ')
        else:
            # 这里可能会有问题,因为我的转载文章还不够分页的数量,所以需要添加多一条printTranshipmentData()
            printTranshipmentData(links, readnum, '转        \n        ')
            # 结束循环
            break


def printTranshipmentData(links,readnum,stripText):
    global n
    for link in links:
        url = link.get('href')
        title = link.text.strip().replace(stripText, "")
        read = readnum[0].text.strip("阅读数:")
        comment = readnum[1].text.strip("评论数:")
        data = {
            'url': url,
            'title': title,
            'readnum': read,
            'comment': comment
        }
        ff = open('转载_文章标题.txt','a')
        if n%10 == 0:
            #ff.write(str(n)+title+'阅读量:'+read+'评论数:'+comment+'\n\n')
            ff.write(str(n)+title+'\n\n')
        else:
            ff.write(str(n)+title+'\n\n')
        ff.close()
        ff = open('转载_链接.txt','a')
        ff.write(url+'\n')
        ff.close()
        n+=1;
        print("转载文章! 有",n,'个完成!')
        #print(data)


def printOriginalData(links,readnum,stripText):
    global m
    for link in links:
        url = link.get('href')
        title = link.text.strip().replace(stripText, "")
        read = readnum[0].text.strip("阅读数:")
        comment = readnum[1].text.strip("评论数:")
        data = {
            'url': url,
            'title': title,
            'readnum': read,
            'comment': comment
        }
        ff = open('原创_文章标题.txt','a')
        if m%10 == 0:
            ff.write(str(m)+title+'\n\n')
        else:
            ff.write(str(m)+title+'\n\n')
        ff.close()
        ff = open('原创_链接.txt','a')
        ff.write(url+'\n')
        ff.close()
        m+=1;
        print("原创文章! 有",m,'个完成!')
        #print(data)

if __name__ == '__main__':
    username = "weixin_42859280"
    n = 0
    m = 0
    getTranshipmentArticle(username)
    print('\n\n------------------以下是原创文章--------------\n\n')
    getOriginalArticle()
    print('总文章数量:',n+m,'原创文章:',m,'篇! 转载文章:',n,'篇!')


代码截图(一页放不下三页来放!):
第一页:
![在这里插0L3dlaXhpbl80Mjg1OTI4MA==,size_16,color_FFFFFF,t_70)
第二页:
V0L3dlaXhpbl80Mjg1OTI4MA==,size_16,color_FFFFFF,t_70)
第三页:
hpbl80Mjg1OTI4MA==,size_16,color_FFFFFF,t_70)

先爬取得是转载的:
下图里面就是我说的不能实现的地方!
阅读量,评论数都是固定不变啦!
在这里插入图片描述
我也是进行了优化的!原来的文章没有依据排序输出功能!
我增加了进行降序输出!虽然在第二个里面就已经实现啦!
但是,目前也没有那么多时间功夫搞这个啦。
等以后我学学爬虫再搞吧!

哈哈,同时也感谢这位老哥帮助!
下面是他文章的链接,也就是我们最先相识的一个文章!
https://blog.csdn.net/stormdony/article/details/79828842#comments
在这里插入图片描述
其他文章,好像就一篇。原博主看到记得联系我!
收获颇丰!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值