网络爬虫-用python获取豆瓣新书推荐信息

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a_step_further/article/details/51638484

前言:

     数据获取是数据分析师的职场必备技能,其中通过网络爬虫,自动、有组织地爬取一些网站数据,既实用,又有趣。本文通过对豆瓣新书速递页面及其子页面的迭代爬取,介绍python3环境下,网络爬虫的入门级用法。

    其中的要点在于通过网页元素信息,定位到目标信息的标签格式,然后通过python的一些网络分析包,如 beautifulsoup 来有效提取相关信息。


一、要爬取的信息说明

       豆瓣读书经常会推荐一些市面上的新书,其页面为https://book.douban.com/latest?icn=index-latestbook-all 。如果想查看每本书的详细信息,需要点击进去二级页面查看。那么,我们这里拿来练手的,就是先访问左下的介绍页面,获取推荐的书的总量,以及每本书的下一步页面链接,然后迭代访问每本书的详情页,找出书名、作者、评分信息。最终统一打印出来。

       

二、爬取过程

     首先要通过查看见面元素信息,找到每个信息项的标签格式,如下图所示:

    

接下来就是要深入到细节,去研究beautifulsoup这类网络分析包的使用接口。针对本文的案例,完整版本的代码如下:

#!/usr/bin/env python3
# coding:utf-8

import datetime
from urllib.request import urlopen
from bs4 import BeautifulSoup
import re

def get_page_content(input_url):
    try:
        raw_page_content = urlopen(input_url)
    except HTTPError as e:
        print(e)
    beautiful_page_content = BeautifulSoup(raw_page_content.read(), "html.parser")
    return beautiful_page_content


if __name__ == "__main__":
    douban_books_url = "https://book.douban.com/latest?icn=index-latestbook-all"
    all_book_content = get_page_content(douban_books_url)

    print("-------------- %s -------------- " % datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))

    # 用正则表达式获取到页面上关于书的详细链接信息
    book_link_pattern = re.compile("https://book.douban.com/subject/[0-9]+")
    book_links = all_book_content.findAll("a", {"href": book_link_pattern})
    print("本日豆瓣推荐新书量: %d" % len(book_links))

    # 迭代地去访问每本书的链接,解析其中关于书的详细信息,如作者、售价、评分等
    for link in book_links:
        book_info_page_url = link.attrs["href"]
        book_content = get_page_content(book_info_page_url)
        book_name = book_content.find("span",{"property":"v:itemreviewed"}).getText()
        if book_content.find("a",{"href":re.compile("/search/.*[%A-Z0-9]+")}) == None:
            book_author = "未识别到作者"
        else:
            book_author = book_content.find("a",{"href":re.compile("/search/.*[%A-Z0-9]+")}).getText()

        if book_content.find("a",{"href":"collections"}).getText() == "评价人数不足":
            book_star = "暂无评分"
        else:
            book_star = book_content.find("strong", {"class": "ll rating_num "}).getText()

        print("----------------------")
        print("书名: %s" % book_name)
        print("作者: %s" % book_author)
        print("评分: %s" % book_star)
        print("豆瓣链接: %s" % book_info_page_url)

        实际执行的结果如下图所示:



猜你喜欢

转载自blog.csdn.net/a_step_further/article/details/51638484