读万卷书行万里路,书是我们获取知识的一大途径,读书可以让人变得精神勃发,让人,能够更加的理解和认识这个世界
今天,给大家分享一个代码,让大家能够将豆瓣读书中的所有图书爬取下来,存储在本地
准备
我们可以进入到豆瓣读书的的分类界面,我们的目标是按照豆瓣图书的标签进行爬取,每一个标签生成一个csv文档,按照书名、作者、评分的格式进行存储
我们本章用requests函数进行数据访问,用bs4进行数据的摘取和筛选
初始化
首先,我们定义一个类,初始化豆瓣读书的网址,书名、作者、评分三个list的信息
import requests
import csv
from bs4 import BeautifulSoup
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'}
class DoubanSpider(object):
def __init__(self):
self.douban_url = "https://book.douban.com/tag"
self.book_name_exist = []
self.book_author = []
self.book_name = []
self.book_score = []
由于我们要频繁的从豆瓣爬取,为了防止频繁访问,被豆瓣封IP,这里还初始化了一个IP代理池,代理池的变量名称为proxies,这里不向大家做展示
然后我们要获取主页信息并返回
import requests
import csv
from bs4 import BeautifulSoup
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'}
class DoubanSpider(object):
def __init__(self):
self.douban_url = "https://book.douban.com/tag"
self.book_name_exist = []
self.book_author = []
self.book_name = []
self.book_score = []
# ==================分割线,下面是新增代码====================================
def enter_first(self):
"""
获取主页信息并返回
:return:
"""
html = requests.get(self.douban_url, headers=headers, proxies=proxies).text
return html
获取每一个书籍标签
然后,我们就要给每一个标签建立一个csv文档,并爬取数据啦,我们通过观察发现,每一个标签对应的网址其实就是https://book.douban.com/tag/标签
那我们就可以通过返回的主页信息,来解析出来每一个标签的值,然后进去获取内容就好啦
先通过bs4解析出来tag的内容,然后循环进入每一个tag进行数据的爬取,将爬取的数据存储在已经初始化好的书名、作者、评分三个list当中;最后,以内容为名称创建csv文件,并将三个list的内容写入即可
import requests
import csv
from bs4 import BeautifulSoup
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'}
class DoubanSpider(object):
def __init__(self):
self.douban_url = "https://book.douban.com/tag"
self.book_name_exist = []
self.book_author = []
self.book_name = []
self.book_score = []
def enter_first(self):
"""
获取主页信息并返回
:return:
"""
html = requests.get(self.douban_url, headers=headers, proxies=proxies).text
return html
# ==================分割线,下面是新增代码====================================
def every_label_genery_info(self, page):
"""
获取每一个分类的html信息
:param page: 分类页的html信息
:return:
"""
html = BeautifulSoup(page, 'lxml')
div_df = html.find_all('td')
# 循环遍历每一个标签
for each_label in div_df:
# 进入下一个标签之前清空书名、作者、评分三个list
self.book_name_exist.clear()
self.book_name.clear()
self.book_author.clear()
self.book_score.clear