python3 使用re、requests、pymongo三个模块,爬取豆瓣读书小说内容的所有信息,并将内容保存到CSV或者mongodb中文件中

python中的爬虫中的requests和re模块,是我们很常见的两个模块,今天用这两个模块,爬取豆瓣读书一个页面上的所有书名以及作者名 ,由于多页爬取和单页的原理相似,这里不做多解释。 豆瓣读书为静态页面,分析较为容易,只需找到页面url变化规律即可。

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
# author:albert time:2019/9/26

import re
import requests
import csv

# 获取一页数据的响应
def get_onepage(page):
    headers = {
        # 该处填写你自己浏览器的请求头,也可以在百度上搜索,不保证百度搜到的都有效   https://www.cnblogs.com/zrmw/p/9332801.html
    }
    url = "https://book.douban.com/tag/{}?start={}&type=T".format(str("小说"), page)  
    # 构造url,爬取关键词为小说的所有信息
    response = requests.get(url=url, headers=headers)
    return response.content.decode("utf-8")
	# 将response格式化返回

# 解析获取的响应
def parse_onepage(html):
    title_list = re.findall(
        '<li.*?title="(.*?)".*?class="pub">\s*(.*?)\s*</div>.*?class="rating_nums">(.*?)</span>\s*<span\sclass="pl">\s*\((.*?)\)\s*<\/span>.*?<p>(.*?)</p>.*?</li>',
        html, re.S)
        # 根据网页的结构写正则表达式,写的时候细心,就不会犯错,虽然刚开始感觉很难,但是不过,你画功夫学,半天的时间就好了,常用的也就那几个符号。
    return title_list

# 保存信息倒csv文件中
def save_data(data_list):
    list = []
    # 将表头写入到csv文件中
    with open("book_data6.csv", "a", encoding="utf-8-sig")as csvfile:
        filename = ['书名', '作者', '评分', '评价人数', '简介']
        file = csv.DictWriter(csvfile, fieldnames=filename)
        file.writeheader()
    # 循环遍历,将信息放到一个列表里,为嵌套结构,每本书的信息村粗到字典里后嵌套到列表里
    for title in data_list:
        data_dist = {}
        data_dist["书名"] = title[0].strip()
        data_dist["作者"] = title[1].strip()
        data_dist["评分"] = title[2].strip()
        data_dist["评价人数"] = title[3].strip()
        data_dist["简介"] = title[4].replace('\n', '').strip()
        # 由于文本信息有换行,导致csv数据格式有些不同,replace()是去掉换行符的作用
        list.append(data_dist)
    # encoding="utf-8-sig"这个应该注意下,观察到,如果加encoding="utf-8",csv文件用excle打开,不会乱码,在pycharm解释器上乱码,程序还有bug,如果不加encoding,在pycharm中不乱码,用excle打开会乱码,而encoding="utf-8-sig"可以避免这个问题。
    with open("book_data6.csv", "a", encoding="utf-8-sig")as csvfile:
        filename = ['书名', '作者', '评分', '评价人数', '简介']
        file = csv.DictWriter(csvfile, fieldnames=filename)
        file.writerows(list) # 将list写入到csv文件
    # 保存到mongodb数据库中  
   	#client = pymongo.MongoClient(host="localhost", port=27017)  # 连接到本地mongodb数据库  localhost  端口号27017
    #db = client.test  # 打开或创建相关的数据库
    #collection = db.douban  # 打开或者创建相关的集合
    #collection.insert_many(list)  # 把list数据插入到数据库中
    print(list)


def run_douban():
	# 爬取50页的内容,也就50页,本来准备爬100页呢,哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
    for i in range(0, 49):
        data = get_onepage(i * 20)
        title_list = parse_onepage(data)
        save_data(title_list)

if __name__ == "__main__":
    run_douban()

浏览器中进行网页解析:

我使用的是Google浏览器,大部分浏览器的功能比较相似,这没有啥区别,主要是看个人习惯。

1.首先在浏览器搜索框中输入豆瓣读书的网址,豆瓣读书,然后按电脑键盘上的F12键。会出现类似下图的界面。
在这里插入图片描述
2.然后按照红色标记进行操作。就可以定位到你想要获取内容的标签。
在这里插入图片描述

根据标签内容,分析正则表达式。


title_list = re.findall(
        '<li.*?title="(.*?)".*?class="pub">\s*(.*?)\s*</div>.*?class="rating_nums">(.*?)</span>\s*<span\sclass="pl">\s*\((.*?)\)\s*<\/span>.*?<p>(.*?)</p>.*?</li>',
        html, re.S)

3.即可以完成数据网页分析
4.当我们点击下一页时候会发现URL只有start=的属性变化,并且是与页面成20倍的关系。我们可以根据这个关系进行url有序变化,进而改变链接。
在这里插入图片描述

5.其他的流程大致都相同,主要难点就是如何分析网页,如何写正则表达式。
6.爬到csv文件的结果:
在这里插入图片描述
加油!!!!

发布了11 篇原创文章 · 获赞 72 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41948771/article/details/101445956
今日推荐