Python_使用requests获取当当网榜单中的图书数据

news2024/11/16 18:08:15

使用requests获取当当网榜单中的图书数据

    • 使用到的库
    • 概述
    • 发送请求
    • xpath解析提取数据
      • tips
    • 完整代码

使用到的库

  • requests
  • etree

概述

主要抓取目标为

  • 当当网图书畅销榜中近24小时畅销的图书信息

主要提取的数据为

  • 排名、书名、评论数、推荐度、作者信息、出版时间、出版社、折扣价、原价、折扣率、电子书价格、详情页链接

在这里插入图片描述

发送请求

# 设置cookie
cookies = {
    'ddscreen': '2',
    'dest_area': 'country_id%3D9000%26province_id%3D111%26city_id%20%3D0%26district_id%3D0%26town_id%3D0',
    '__permanent_id': '20230727111738725280659109780638954',
    '__visit_id': '20230727111738728252759597714636934',
    '__out_refer': '',
    '__trace_id': '20230727111738729253018287016217767'
}

# 设置请求头
headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    # Requests sorts cookies= alphabetically
    # 'Cookie': 'ddscreen=2; dest_area=country_id%3D9000%26province_id%3D111%26city_id%20%3D0%26district_id%3D0%26town_id%3D0; __permanent_id=20230311201918630282239304091816610; __visit_id=20230613202543057355948286659409526; __out_refer=; __rpm=...1686659146436%7C...1686659147726; __trace_id=20230613202548496123352493475398790',
    'Pragma': 'no-cache',
    'Referer': 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-2-1',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
}

...

# 发送请求
response = requests.get(url, cookies=cookies, headers=headers, verify=False)

xpath解析提取数据

  • 本案例中主要使用Xpath来提取数据,也可以使用其他方法提取数据
# 使用XPATH解析提取数据
        lists = html.xpath('//div//ul[@class="bang_list clearfix bang_list_mode"]//li')

        # 提取:排名、书名、评论数、推荐度、作者信息、出版时间、出版社、折扣价、原价、折扣率、电子书价格
        for li in lists:
            book_info = {
                "排名": "".join(li.xpath('./div[1]/text()')).replace(".", ""),
                "书名": "".join(li.xpath('.//div[3]/a/@title')),
                "评论数": "".join(li.xpath('.//div[4]/a/text()')).replace("条评论", ""),
                "推荐度": "".join(li.xpath('.//div[4]/span/text()')).replace("推荐", ""),
                "作者信息": "".join(li.xpath('.//div[5]/a/text()')),
                "出版时间": "".join(li.xpath('.//div[6]/span/text()')),
                "出版社": "".join(li.xpath('.//div[6]/a/text()')),
                "折扣价": "".join(li.xpath('.//div[@class="price"]//span[@class="price_n"]/text()')),
                "原价": "".join(li.xpath('.//div[@class="price"]//span[@class="price_r"]/text()')),
                "折扣率": "".join(li.xpath('.//div[@class="price"]//span[@class="price_s"]/text()')),
                "电子书价格": "".join(li.xpath('.//div[@class="price"]//p[@class="price_e"]/span/text()')),
                "详情页链接": "".join(li.xpath('.//div[@class="name"]/a/@href'))
            }

tips

  • 提取到的数据可变量直接接收然后存放到列表中,如下
    # ranking = "".join(li.xpath('./div[1]/text()')).replace(".", "")
    # name = "".join(li.xpath('.//div[3]/a/@title'))
    # comments = "".join(li.xpath('.//div[4]/a/text()')).replace("条评论", "")
    # recommend_level = "".join(li.xpath('.//div[4]/span/text()')).replace("推荐", "")
    # author = "".join(li.xpath('.//div[5]/a/text()'))
    # publish_time = "".join(li.xpath('.//div[6]/span/text()'))
    # press = "".join(li.xpath('.//div[6]/a/text()'))
    # discount_price = "".join(li.xpath('.//div[@class="price"]//span[@class="price_n"]/text()'))
    # original_price = "".join(li.xpath('.//div[@class="price"]//span[@class="price_r"]/text()'))
    # discount_rate = "".join(li.xpath('.//div[@class="price"]//span[@class="price_s"]/text()'))
    # ebook_Price = "".join(li.xpath('.//div[@class="price"]//p[@class="price_e"]/span/text()'))
    # details_url = "".join(li.xpath('.//div[@class="name"]/a/@href'))
    #
    # result_list = [ranking, name, comments, recommend_level, author, publish_time, press, discount_price, original_price, discount_rate, ebook_Price, details_url]
    

完整代码

import requests
from lxml import etree


# 获取当当网数据
def crawl_dd():
    # 设置cookie
    cookies = {
        'ddscreen': '2',
        'dest_area': 'country_id%3D9000%26province_id%3D111%26city_id%20%3D0%26district_id%3D0%26town_id%3D0',
        '__permanent_id': '20230727111738725280659109780638954',
        '__visit_id': '20230727111738728252759597714636934',
        '__out_refer': '',
        '__trace_id': '20230727111738729253018287016217767'
    }

    # 设置请求头
    headers = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Cache-Control': 'no-cache',
        'Connection': 'keep-alive',
        'Pragma': 'no-cache',
        'Referer': 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-2-1',
        'Upgrade-Insecure-Requests': '1',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
    }

    # url地址
    # url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1'

    # 抓取指定页数的数据
    for i in range(1, 5):
    	# 请求地址
        url = f'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-{i}'

        # 发送请求
        response = requests.get(url, cookies=cookies, headers=headers, verify=False)

        # 将网页响应结果转换为文本
        content = response.text

        # 解析字符串格式的HTML文档对象,将传进去的字符串转变成_Element对象
        html = etree.HTML(content)

        # 使用XPATH解析提取数据
        lists = html.xpath('//div//ul[@class="bang_list clearfix bang_list_mode"]//li')

        # 提取:排名、书名、评论数、推荐度、作者信息、出版时间、出版社、折扣价、原价、折扣率、电子书价格
        for li in lists:
            book_info = {
                "排名": "".join(li.xpath('./div[1]/text()')).replace(".", ""),
                "书名": "".join(li.xpath('.//div[3]/a/@title')),
                "评论数": "".join(li.xpath('.//div[4]/a/text()')).replace("条评论", ""),
                "推荐度": "".join(li.xpath('.//div[4]/span/text()')).replace("推荐", ""),
                "作者信息": "".join(li.xpath('.//div[5]/a/text()')),
                "出版时间": "".join(li.xpath('.//div[6]/span/text()')),
                "出版社": "".join(li.xpath('.//div[6]/a/text()')),
                "折扣价": "".join(li.xpath('.//div[@class="price"]//span[@class="price_n"]/text()')),
                "原价": "".join(li.xpath('.//div[@class="price"]//span[@class="price_r"]/text()')),
                "折扣率": "".join(li.xpath('.//div[@class="price"]//span[@class="price_s"]/text()')),
                "电子书价格": "".join(li.xpath('.//div[@class="price"]//p[@class="price_e"]/span/text()')),
                "详情页链接": "".join(li.xpath('.//div[@class="name"]/a/@href'))
            }
			
			# 测试输出
            print(book_info)
            
if __name__ == '__main__':
    crawl_dd()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/804754.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL主从复制(三十五)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、MySQL Replication概述 1.1 MySQL Replication优点: 二、MySQL复制类型 2.1 异步复制(Asynchronous repication) 2.2 全同步…

vue的条件渲染以及列表渲染的总结归纳加代码演示

😀前言 本片文章是vue系列第4篇整理了vue的条件渲染以及列表渲染的总结归纳加代码演示 🏠个人主页:尘觉主页 🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我…

OR-Tools解决复杂调度问题:实际案例分析

目录 前言一、调度问题介绍二、案例分析2-1、护士调度问题2-2、作业车间调度问题 三、知识库3-1、collection3-2、CpModel().AddNoOverlap()3-3、CpModel().AddMaxEquality()3-4、cp_model.CpModel().NewIntVar()3-5、cp_model.CpModel().NewIntervalVar 总结 前言 调度问题是一…

干货 | 电路中为何需要串联小电阻?这样解释就懂了

干货 | 电路中为何需要串联小电阻?这样解释就懂了 一、电阻概念 电阻作为元器件,又叫作电阻器,导体的电阻通常用字母R表示,电阻的单位是欧姆(ohm),简称欧,符号是Ω(希腊字…

oracle,获取每日24*60,所有分钟数

前言: 为规范用户的时间录入,因此我们采用下拉的方式,让用户选择需要的时间,因此我们需要将一天24小时的时间拆分为类似00:00,00:01...23:00,23:01,23:59。因此我们需要生成24*601440行的下拉复选值。具体效果如下图所示。 思路 1…

langchina的PlayWrightBrowserToolkit (PlayWright 浏览器工具包)

langchina中的PlayWrightBrowserToolkit 好久不见了,朋友们,我(小云)也是好久不写博客了,随着ai的不断引进,和一大堆大语言的到来,我们今天就学习一下啊langchain这个大语言模型中PlaywrightBr…

如何快速用PHP取短信验证码

要用PHP获取短信验证码,通常需要连接到一个短信服务提供商的API,并通过该API发送请求来获取验证码。由于不同的短信服务提供商可能具有不同的API和授权方式,我将以一个简单的示例介绍如何使用Go语言来获取短信验证码。 在这个示例中&#xff…

硬件系统工程师宝典(34)-----FLASH电路如何设计?

各位同学大家好,欢迎继续做客电子工程学习圈,今天我们继续来讲这本书,硬件系统工程师宝典。 上篇我们了解了存储器可分为RAM和ROM,根据不同特性也可以逐级细分,并且简单介绍了EEPROM。今天我们讲一讲FLASH有哪几种&am…

软件测试四年,总结下功能测试用例设计思路

我们为什么要写好一份测试用例呢?测试同学应该都知道测试用例的重要性,测试用例就是我们测试的依据,也是测试过程中不能缺少的测试文档。 一、用例编写规范目的: 1、提高测试用例的可读性,可执行性、合理性。 2、测…

【论文阅读】通过解缠绕表示学习提升领域泛化能力用于主题感知的作文评分

摘要 本文工作聚焦于从领域泛化的视角提升AES模型的泛化能力,在该情况下,目标主题的数据在训练时不能被获得。本文提出了一个主题感知的神经AES模型(PANN)来抽取用于作文评分的综合的表示,包括主题无关(pr…

Lambda表达式常见的Local variable must be final or effectively final原因及解决办法

目录 Local variable must be final or effectively final错误原因 解决办法按照要求定义为final(不符合实情,很多时候是查库获取的变量值)使用原子类存储变量,保证一致性AtomicReference常用原子类 其它 Local variable must be …

(树) 剑指 Offer 07. 重建二叉树 ——【Leetcode每日一题】

❓剑指 Offer 07. 重建二叉树 难度:中等 输入某二叉树的 前序遍历 和 中序遍历 的结果,请构建该二叉树并返回其根节点。 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 示例 1: Input: preorder [3,9,20,15,7], inorder [9,3,15,20,7] …

8.11 PowerBI系列之DAX函数专题-TopN中实现N的动态

需求 实现 1 ranking by amount rankx(allselected(order_2[产品名称]),[total amount]) 2 rowshowing_boolean var v_ranking [ranking by amount] var v_topN-no [topN参数 值] var v_result int( v_ranking < v_topN_no) return v_result 3 将度量值2放入视觉对象筛…

spinal HDL语法学习

1 赋值语句 用来声明变量 : 用来对变量进行赋值 2 when otherwise前面是否有"."与otherwise是否换行有关系 3 case class 对Bundle进行扩展时&#xff0c;需要case class case class和class主要有两点区别&#xff1a; &#xff08;1&#xff09;case class不需…

会议OA项目之会议发布(一)

目录 前言&#xff1a; 会议发布的产品原型图&#xff1a; 1.会议发布 1.1实现的特色功能&#xff1a; 1.2思路&#xff1a; 使用的数据库&#xff1a; 我们要实现多功能下拉框的形式选择可以参考原文档&#xff1a;https://hnzzmsf.github.io/example/example_v4.html#down…

运算放大器--------加减运算电路

反向求和运算电路 电路 公式 同向加法运算电路 电路 公式 加减运算电路 分别求正向输入的输出和反相输入的输出&#xff0c;然后求和就可以得到到最终的输出。 切记&#xff0c;虚短虚断不是真正的断路和短路。

antDesign的a-select数据回显选中initialValue问题解决方法

在开发过程中表单中的【学习专业】下拉列表项需要数据回显&#xff0c;设置了initialValue&#xff0c;但只显示下拉选项的majorId值, 没有显示具体的专业名称&#xff0c;经排查发现是majorId数据类型导致的&#xff0c;下拉选项majorList数组中的id是数值类型&#xff0c;而在…

LeetCode|backtracking|review:40. 131. 93. 47. 332. | 37. Sudoku Solver

复习&#xff1a; 40. Combination Sum II [1,1,2,3]中&#xff0c;答案里有[1,1,2], 但是不能有两个[1,2,3] 131. Palindrome Partitioning 每个for都是在给定的start之后找一个palindrome。当start 93. Restore IP Addresses forloop每次loop都是在给定的start的后三个数…

Redis三种模式——主从复制,哨兵模式,集群

目录 一、主从复制 1.1主从复制的概念 1.2Redis主从复制作用 1.2.1数据冗余 1.2.2故障恢复 1.2.3负载均衡 1.2.4高可用基石 1.3Redis主从复制流程 1.4部署Redis 主从复制 1.4.1.环境部署 1.4.2.所有服务器都先关闭防火墙 1.4.3.所有服务器都安装Redis 1.4.4修改Master主节点R…

IFIX5.8安装教程

管理员身份运行&#xff1a; 安装&#xff1a; 下次安装的时候选择SCADA服务器&#xff0c;独立。然后下图就不会出现了。 重启电脑&#xff1a;