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)
  • 相关阅读:
    POJ 3258 (NOIP2015 D2T1跳石头)
    POJ 3122 二分
    POJ 3104 二分
    POJ 1995 快速幂
    409. Longest Palindrome
    389. Find the Difference
    381. Insert Delete GetRandom O(1)
    380. Insert Delete GetRandom O(1)
    355. Design Twitter
    347. Top K Frequent Elements (sort map)
  • 原文地址:https://www.cnblogs.com/luoxu34/p/5401563.html
Copyright © 2011-2022 走看看