爬取豆瓣图书信息并将图书提取出来保存到MongoDB中

复制代码
前期我们介绍过使用xpath解析数据,这次在原基础上将爬取下的数据直接保存到MongoDB中。
参考代码如下:

from lxml import etree
import requests
import re
import pymongo

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:132.0) Gecko/20100101 Firefox/132.0'
}

# 根据url抓取网页内容
def getOnePage(url):
    resp = requests.get(url, headers=headers)
    try:
        # 服务器响应正常
        if resp.status_code == 200:
            return resp.text
        return None
    except Exception:
        return None

# 分析HTML代码  xpath 获取内容   使用正则表达式匹配所需字符串
def parseOnePage(html):

     # 获取连接对象
    client = pymongo.MongoClient()
    # 获取数据库对象如果db-books不存在新建
    db = client['db-novels']
    # 获取要操作的集合  如果此集合不存在  会新建
    collection = db['collection-book']
    selector_html = etree.HTML(html)
    #选取节点  获取所有的图书的div
    items = selector_html.xpath('//div[@class="doulist-item"]')
    # 遍历div
    for item in items:
        # 图书的图片地址
        pic = item.xpath('.//div[@class="post"]/a/img/@src')[0]
        bname = item.xpath('.//div[@class="title"]/a/text()')[0]
        bname = re.search("\\w+", bname)
        bname = bname.group()
        rate = item.xpath('.//div[@class="rating"]/span[last()-1]/text()')[0]

        author = item.xpath('.//div[@class="abstract"]/text()')[0]
        author = re.search("(?<=作者:\\s)(.*)", author, re.M)
        if author is not None:
            author = author.group()
        company = item.xpath('.//div[@class="abstract"]/text()')[1]
        company = re.search("(?<=出版社:\\s)(.*)", company)
        company = company.group()
        date = item.xpath('.//div[@class="abstract"]/text()')[2]
        date = re.search("\\d{4}(-\\d{1,2})?", date)
        if date is not None:
            date = date.group()
        print(bname+'\t'+author+'\t'+company+'\t'+date+'\t'+rate+'\t'+pic)
        # 将数据存储在列表中
        list = [['bname',bname],['author',author],['company',company],['b-date',date],['rate',rate],['pic-url',pic]]
        # 将列表转为字典类型
        row = dict(list)
        print(row)
        # 将数据插入到数据库表中
        collection.insert_one(row)

#抓取URL页面,并保存到文件中
def getTop100(url):
    # 获取页面的数据
    html = getOnePage(url)
   # 从页面提取图书信息并保存到MongoDB数据库中
    parseOnePage(html)

# 分页的四个Url地址
urls = ['https://www.douban.com/doulist/45004834/?start={}'.format( str(i) ) for i in range(0,100,25)]
for url in urls:
    print(url)
    getTop100(url)

运行结果如下:

相关推荐
清风-云烟12 分钟前
使用redis-cli命令实现redis crud操作
java·linux·数据库·redis·spring·缓存·1024程序员节
雾里看山20 分钟前
【MySQL】数据库基础知识
数据库·笔记·mysql·oracle
vd_vd1 小时前
Redis内存面试与分析
数据库·redis·面试
码农研究僧2 小时前
Oracle SQL: TRANSLATE 和 REGEXP_LIKE 的知识点详细分析
数据库·sql·oracle·translate·regexp_like
Denodo2 小时前
10倍数据交付提升 | 通过逻辑数据仓库和数据编织高效管理和利用大数据
大数据·数据库·数据仓库·人工智能·数据挖掘·数据分析·数据编织
wallezhou2 小时前
mysql数据库启动出现Plugin ‘FEEDBACK‘ is disabled.问题解决记录
数据库·mysql
神洛华3 小时前
Y3编辑器功能指引
java·数据库·编辑器
狮歌~资深攻城狮3 小时前
TiDB与Oracle:数据库之争,谁能更胜一筹?
数据库·数据仓库·分布式·数据分析·tidb
向阳12183 小时前
doris:阿里云 OSS 导入数据
数据库·阿里云·云计算·doris
暮湫3 小时前
MySQL(4)多表查询
数据库·mysql