欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python采用requests+bs4爬取豆瓣top250图书信息

程序员文章站 2022-12-30 15:50:16
1.介绍使用python采用requests+bs4爬取豆瓣top250图书信息,参考代码中都有注释就不详细说了。链接:https://book.douban.com/top250?start=0可以输出的内容:(对应上图举例)图书封面的链接:https://img1.doubanio.com/view/subject/s/public/s1070959.jpg书名:红楼梦作者:[清] 曹雪芹 著出版社: 人民文学出版社发行年份:1996-12价格:59.70元评分:9.6评价人数:...

1.介绍

使用python采用requests+bs4爬取豆瓣top250图书信息,参考代码中都有注释就不详细说了。
python采用requests+bs4爬取豆瓣top250图书信息
链接:https://book.douban.com/top250?start=0
可以输出的内容:(对应上图举例)
图书封面的链接:https://img1.doubanio.com/view/subject/s/public/s1070959.jpg
书名:红楼梦
作者:[清] 曹雪芹 著
出版社: 人民文学出版社
发行年份:1996-12
价格:59.70元
评分:9.6
评价人数:293896
名言:都云作者痴,谁解其中味?
实现的功能:可以分页爬取所有top250的图书信息以及存储相关数据进入数据库

2.参考代码

# -*- coding: utf-8 -*-
# author:Gary
import requests  # 获取网页内容
from bs4 import BeautifulSoup  # 解析网页内容
import pymysql


# 获取网页的内容
def get_html(url):
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/79.0.3945.130 Safari/537.36'}
    res = requests.get(url, headers=header)  # 获取网页,并带有伪装的浏览器头,一般好的网站会有检测是不是程序访问
    res.encoding = res.apparent_encoding  # 设置编码,防止乱码
    # print(res.text)#输出网页内容
    return res.text  # 返回网页的内容


# 通过bs4解析,主要是标签选择器
def ana_by_bs4(html):
    soup = BeautifulSoup(html, 'html.parser')  # 注意需要添加html.parser解析
    tables = soup.find_all("table")  # 选择table标签
    # 或者通过tr的class属性定位
    # trs = soup.find_all('tr', class_='item')
    data_list = []
    for table in tables:
        img = table.find('img')['src']  # 图片链接
        # title = table.find('div', class_='pl2').text.strip()  # 正标题
        title = table.find('div', class_='pl2').find('a')['title']  # 去除多余换行
        strInfo = table.find('p', class_='pl').text.strip()  # 作者、出版社、年份、价格等信息
        '''
        infos = strInfo.strip() .split('/')#有多作者的可能,这个方面就会出错
        # print(infos)
        author = infos[0].strip().replace('\n','')  # 作者
        pub = infos[1].strip()  # 出版社
        year = infos[2].strip()  # 年份
        price = infos[3].strip()  # 价格
        '''
        infos = strInfo.strip().split('/')  # 有多作者的可能
        author_list = infos[:-3]
        author = ''
        for item in author_list:
            author += '/' + item.strip().replace('\n', '')  # 作者
        author = author[1:]  # 因为多了一个/,所以第一个/不输出,优化输出效果
        pub = infos[-3].strip()  # 出版社
        year = infos[-2].strip()  # 年份
        price = infos[-1].strip()  # 价格
        rating = table.find('span', class_='rating_nums').text.strip()  # 评分
        remark_num = table.find('span', class_='pl').text.replace('\n', '').strip()[20:-3]  # 评分人数
        try:
            quote = table.find('span', class_='inq').text.replace('\n', '')  # 名言
        except:  # 名言可能不存在
            quote = ''

        # 优化输出模式
        print('---------------------------------华丽的分割线--------------------------------------')
        # print('图片封面链接', '书名', '作者', '出版社', '年份', '价格', '评分', '评分人数', '名言')
        print('图片封面链接:', img)
        print('书名:', title)
        print('作者:', author)
        print('出版社:', pub)
        print('出版年份:', year)
        print('售价:', price)
        print('评分:', rating)
        print('评价人数:', remark_num)
        print('名言或评注:', quote)
        # print(img, title, author,pub, year, price, rating,remark_num, quote)
        data_list.append((img, title, author, pub, year, price, rating, remark_num, quote))
    return data_list


# 存储数据
def insert_data(data_list):
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='Xts0916.', db='spider',
                           charset='utf8')  # 连接数据库
    cur = conn.cursor()  # 用于访问和操作数据库中的数据(一个游标,像一个指针)
    # 首先得保证存在spider数据库,然后库中有books表,属性和下面的对应
    sql = 'insert into books(img_href, title, author,pub, pub_year, price, grade,remark_num, quote) values(%s,%s,%s,%s,%s,%s,%s,%s,%s)'  # 插入多条
    cur.executemany(sql, data_list)  # data_list类型是列表中嵌套多个元组比如[(),(),()]
    conn.commit()  # 提交事务,执行了这一步数据才真正存到数据库
    cur.close()  # 关闭游标
    conn.close()  # 关闭数据库连接


if __name__ == '__main__':
    for page in range(10):
        print('第{}页'.format(page + 1))
        single_url = 'https://book.douban.com/top250?start={}'.format(page * 25)  # 图书每一页的url,有多页的时候需要观察url的规律
        text = get_html(single_url)  # 获取网页内容
        # print(text)
        dataList = ana_by_bs4(text)  # bs4方式解析
        # insert_data(dataList)  # 数据存入数据库

本文地址:https://blog.csdn.net/weixin_44388092/article/details/107557166