爬虫目的:

随着近年互联网的发展,网络上的信息飞速数量增长。在庞大的数据面前想要获得
期望的信息往往如同大海捞针。通过合理的筛选,在百万甚至数亿计的数据中找到所需
信息,无疑有着非常大的意义。

在豆瓣网下,有很多与日常生活相关的模块网站

python爬虫豆瓣图书 python爬取豆瓣书评_分页

内置的评分评价功能可以为用户提供很大选择空间,以豆瓣读书为例:

python爬虫豆瓣图书 python爬取豆瓣书评_分页_02


其中包含六个大型模块(文学,流行,文化,生活,经管,科技),内部细分了145个小型模块。

在以数十万计的图书信息中,找到各模块中热门好评图书,对于读者或是书商都是很重要的。

爬虫代码概述

一.数据存储

csv文件存储,为方便后继使用pandas进行分析,对于爬取的html文件使用BeautifulSoup进行解析
字段选择为 :

  • 书名(titles)
  • 作者/出版社(authors)
  • 评分(nums)
  • 评论数(peoples)
csvinfo = open(name + '.csv', 'ab')
    begcsv = csv.writer(csvinfo)
    begcsv.writerow(['titles', 'authors', 'nums', 'peoples'])
    csvinfo.close()

二.网页解析

html中书名(titles)
作者/出版社(authors)
评分(nums)
评论数(peoples)等字段对应selector分别为:

#subject_list > ul > li > div.info > h2 > a

    #subject_list > ul > li > div.info > div.pub

    #subject_list > ul > li > div.info > div.star.clearfix > span.rating_nums

    #subject_list > ul > li > div.info > div.star.clearfix > span.pl

解析代码如下 :

# 爬取指定name模块的url,并存储至name.csv文件
'''
遇到不懂的问题?Python学习交流群:1136201545满足你的需求,资料都已经上传群文件,可以自行下载!
'''
def web(url, name):
    db_data = requests.get(url, headers=header)
    soup = BeautifulSoup(db_data.text, 'lxml')
    titles = soup.select('#subject_list > ul > li > div.info > h2 > a')
    authors = soup.select('#subject_list > ul > li > div.info > div.pub')
    nums = soup.select('#subject_list > ul > li > div.info > div.star.clearfix > span.rating_nums')
    peoples = soup.select('#subject_list > ul > li > div.info > div.star.clearfix > span.pl')

    for title, author, num, people in zip(titles, authors, nums, peoples):
        data = [
            (
                title.get('title'),
                author.get_text().replace(' ', '').replace("\n", ""),
                num.get_text().replace(' ', '').replace("\n", ""),
                people.get_text().replace(' ', '').replace("\n", "")
            )
        ]
        csvfile = open(name + '.csv', 'ab')
        writer = csv.writer(csvfile)
        print(data)
        writer.writerows(data)
        csvfile.close()

三.请求头设置

header = {
'Accept': '*/*;',
'Connection': 'keep-alive',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Accept-Encoding': 'gzip, deflate, br',
'Host': 'book.douban.com',
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'

}

四.图书分页

python爬虫豆瓣图书 python爬取豆瓣书评_python爬虫豆瓣图书_03


在豆瓣的反爬虫机制中,正常人浏览习惯只会查看靠前的页码,而位于后面的一般不会查看,所以豆瓣将50页之后的书籍信息设置为只能通过搜索查询,在分页中无法查看。url规则为每页加20,get请求,所以在确定标签后,可以修改start值来换页。

python爬虫豆瓣图书 python爬取豆瓣书评_上传_04


python爬虫豆瓣图书 python爬取豆瓣书评_Python_05


代码:

'''
遇到不懂的问题?Python学习交流群:1136201545满足你的需求,资料都已经上传群文件,可以自行下载!
'''
# name模块标签分页  指定为前50页
def setCsv(name):
    url = 'https://book.douban.com/tag/' + name
    urls = [('https://book.douban.com/tag/' + name + '?start={}&type=T').format(str(i)) for i in range(20, 980, 20)]
    info(name=name)
    web(url, name)
    for single_url in urls:
        print(single_url)
        web(single_url, name=name)

五.完整代码

# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
import requests
import csv
import sys
'''
遇到不懂的问题?Python学习交流群:1136201545满足你的需求,资料都已经上传群文件,可以自行下载!
'''
reload(sys)
sys.setdefaultencoding('utf-8')

# 请求头设置
header = {
    'Accept': '*/*;',
    'Connection': 'keep-alive',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Accept-Encoding': 'gzip, deflate, br',
    'Host': 'book.douban.com',
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'
}


# 初始化csv文件
def info(name):
    csvinfo = open(name + '.csv', 'ab')
    begcsv = csv.writer(csvinfo)
    begcsv.writerow(['titles', 'authors', 'nums', 'peoples'])
    csvinfo.close()


# 爬取指定name模块的url,并存储至name.csv文件
def web(url, name):
    db_data = requests.get(url, headers=header)
    soup = BeautifulSoup(db_data.text, 'lxml')
    titles = soup.select('#subject_list > ul > li > div.info > h2 > a')
    authors = soup.select('#subject_list > ul > li > div.info > div.pub')
    nums = soup.select('#subject_list > ul > li > div.info > div.star.clearfix > span.rating_nums')
    peoples = soup.select('#subject_list > ul > li > div.info > div.star.clearfix > span.pl')

    for title, author, num, people in zip(titles, authors, nums, peoples):
        data = [
            (
                title.get('title'),
                author.get_text().replace(' ', '').replace("\n", ""),
                num.get_text().replace(' ', '').replace("\n", ""),
                people.get_text().replace(' ', '').replace("\n", "")
            )
        ]
        csvfile = open(name + '.csv', 'ab')
        writer = csv.writer(csvfile)
        print(data)
        writer.writerows(data)
        csvfile.close()


# name模块标签分页  指定为前50页
def setCsv(name):
    url = 'https://book.douban.com/tag/' + name
    urls = [('https://book.douban.com/tag/' + name + '?start={}&type=T').format(str(i)) for i in range(20, 980, 20)]
    info(name=name)
    web(url, name)
    for single_url in urls:
        print(single_url)
        web(single_url, name=name)


if __name__ == '__main__':
    setCsv(str)  #str为标签名