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文件的结果:
加油!!!!