zoukankan      html  css  js  c++  java
  • 我的第一次Python爬虫——获取自己博客园的所有文章

    最近在学 python 爬虫,所以拿自己的博客开刀,作为一次简单的 Python 爬虫实践。

    Python 爬虫脚本的功能:

    1、获得所有的文章标题和地址;

    2、获得右侧公告栏里的个人信息。

    1

    运行的结果

    2

    先打印公告中的个人信息和文章的总数,接着列出所有的文章。截图只是开头的一部分。

    这个脚本有什么用呢?

    备份。以前我使用网上的软件备份自己QQ空间的日志,需要在软件上登录自己的账号,风险很大。

    源码[get_articles_from_cnblogs.py]:

     1 #!/usr/bin/env python3.5
     2 # -*- coding:utf-8 -*-
     3 
     4 from bs4 import BeautifulSoup
     5 import requests
     6 import re
     7 
     8 name = 'artech'
     9 my_cnbolgs = 'http://www.cnblogs.com/' + name
    10 
    11 #文章列表,每个元素都是字典,格式:{'title':aaa, 'url':bbb}
    12 article_list = []
    13 
    14 
    15 def get_articles(name):
    16     page = get_total_pages_v2(name)    #获得总页数
    17     for i in range(1, page+1):
    18         url = 'http://www.cnblogs.com/{}/default.html?page={}'.format(name,i)
    19         get_one_page_articles(url)
    20 
    21 
    22 def get_one_page_articles(url):
    23     wb_data = requests.get(url)
    24     soup = BeautifulSoup(wb_data.text,'lxml')
    25     articles = soup.select('a.postTitle2')
    26 
    27     for article in articles:
    28         data = {
    29             'title':article.get_text(),
    30             'url':article.get('href')
    31         }
    32         article_list.append(data)
    33     return article_list
    34 
    35 
    36 # get_total_pages方法只是截取一个字符,文章页数不能超过9页
    37 def get_total_pages(name):
    38     url  = 'http://www.cnblogs.com/{}/default.html?page=2'.format(name)
    39     web  = requests.get(url)
    40     soup = BeautifulSoup(web.text,'lxml')
    41     page = soup.select('div.pager')
    42     num  = page[1].get_text()[4:5]  #总页数,是个字符
    43     return int(num)
    44 
    45 
    46 def get_total_pages_v2(name):
    47     url  = 'http://www.cnblogs.com/{}/default.html?page=2'.format(name)
    48     web  = requests.get(url)
    49     soup = BeautifulSoup(web.text,'lxml')
    50     page = soup.select('div.pager')
    51     num  = page[1].get_text()[4:5]
    52 
    53 ##    print(page[1].get_text())
    54     SEARCH_PAT = re.compile(r'd+')
    55     pat_search = SEARCH_PAT.search(page[1].get_text())
    56     if pat_search != None:
    57 ##        print(pat_search.group())
    58         num = pat_search.group()
    59     return int(num)
    60 
    61 
    62 def get_info(name):
    63     url  = 'http://www.cnblogs.com/mvc/blog/news.aspx?blogApp=' + name
    64     web  = requests.get(url)
    65     soup = BeautifulSoup(web.text,'lxml')
    66     info = soup.select('div > a')
    67 ##    nick = info[0].get_text()
    68 ##    age = info[1].get_text()
    69 ##    followers = info[2].get_text()
    70 ##    follwees = info[3].get_text()
    71     data = [info[i].get_text() for i in range(0,4)]
    72 ##    nick,age,followers,follwees = data
    73     return data
    74 
    75 
    76 if __name__ == '__main__':
    77     nick,age,followers,follwees = get_info(name)  # 获取个人信息
    78     get_articles(name)                            # 获取文章列表
    79     print('昵称:' + nick, ' 园龄:' + age,' 粉丝:' + followers,
    80           ' 关注:' + follwees, ' 文章:' + str(len(article_list)))
    81     print()
    82     for i in article_list:
    83         print(i['title'], i['url'], sep='
    ')
    84         print()

    一些说明

    1、获取公告中的信息(获取异步加载的数据)

    学了爬虫对于网页有更多的认识:发现博客地址 http://www.cnblogs.com/luoxu34 只是正文部分(文章列表),侧边的所有信息都是 js 异步加载出来的。

    3

    2、统计文章总数

    第一个版本的 get_total_pages 方法:

    # get_total_pages方法只是截取一个字符,文章页数不能超过9页
    def get_total_pages(name):
        url  = 'http://www.cnblogs.com/{}/default.html?page=2'.format(name)
        web  = requests.get(url)
        soup = BeautifulSoup(web.text,'lxml')
        page = soup.select('div.pager')
        num  = page[1].get_text()[4:5]  #总页数,是个字符
        return int(num)

    自己使用的博客模版上是没有显示博文总数的,所以脚本是用 len 方法计算 article_list 列表的长度,作为文章的数量。

    为了获得所有的文章,就要知道一共有多少页。

    4

    http://www.cnblogs.com/luoxu34/default.html?page=2 是第二页的文章列表,上下位置都出现了“共几页”的字样。

    get_total_pages 方法就是截取了其中的一个字符,但是超过 9页的文章就有问题。

    image

    3、get_total_pages_v2(name) 方法

    下图先把 <div class="paper"> 标签下的文字打印出来,用 正则 匹配出了页数。

    5

    http://www.cnblogs.com/Artech 一共有 564篇文章,截止现在:

    6

    这样就正确统计出了文章的总数。

    def get_total_pages_v2(name):
        url  = 'http://www.cnblogs.com/{}/default.html?page=2'.format(name)
        web  = requests.get(url)
        soup = BeautifulSoup(web.text,'lxml')
        page = soup.select('div.pager')
        num  = page[1].get_text()[4:5]
    
    ##    print(page[1].get_text())
        SEARCH_PAT = re.compile(r'd+')
        pat_search = SEARCH_PAT.search(page[1].get_text())
        if pat_search != None:
    ##        print(pat_search.group())
            num = pat_search.group()
        return int(num)
  • 相关阅读:
    转 Unicdoe【真正的完整码表】对照表
    golang中,unsafe.sizeof到底是干嘛的?
    转载 Golang []byte与string转换的一个误区
    python异常处理--try except else raise finally
    微信静默授权增加浏览器历史记录导致跳转死循环的解决方案
    package-lock.json,我们应该了解
    webpack实现静态资源缓存的那点事
    webpack+babel项目在IE下报Promise未定义错误引出的思考
    CORS预检请求详谈
    谈谈form-data请求格式
  • 原文地址:https://www.cnblogs.com/luoxu34/p/5401563.html
Copyright © 2011-2022 走看看