python写爬虫爬取京东商品信息

在这里插入图片描述

工具库

爬虫有两种方案:

  • 第一种方式是使用request模拟请求,并使用bs4解析respond得到数据。
  • 第二种是使用selenium和无头浏览器,selenium自动化操作无头浏览器,由无头浏览器实现请求,对得到的数据进行解析。

第一种方案部署简单,效率高,对于静态页面效果较好,对于动态页面效果较差。【可以理解为直接与服务器对接,申请什么数据完全由你自己来决定】

对于网页来说,可以分为静态网页和动态网页,二者的区别是静态网页是对于你的申请切切实实存在一个html网页文件,将这个文件发给你,你浏览器进行渲染。而动态网页则是存在一个服务器框架,处理你的请求,临时组合成一个html网页发给你,你浏览器进行渲染,你得到的是服务器框架的产物。
在这里插入图片描述

因此网页的数据来源也可以分为:
1、静态网页内的,
2、通过Ajax接口申请的,例如商品的评价数量,加载网页时不随网页一块儿得到,而是额外申请
3、通过JS脚本运行+Ajax接口申请的,例如商品的具体评价,只有你点评论栏,JS脚本才会向服务器申请数据

第二种方案部署稍微麻烦,需要安装无头浏览器,但是爬取效果较好,因为是真实的浏览器申请,selenium是模拟真人进行操作,对于反爬虫效果较好。
本文使用的是第一种,所需的工具库:
Python库:
Beautifulsoup
request
json

方法:

1、登录京东,获取登录cookie
2、搜索,得到搜索链接
3、使用request向搜索链接发送请求,得到respond
4、使用bs4解析respond
5、定位想要的数据所在的tag
6、对于一些动态数据,在浏览器开发者工具的network中找到相应的服务器地址,使用request模拟请求,并使用json解析服务器的respond

代码

import requests, json
from bs4 import BeautifulSoup# 基类,后续可以在此之上扩展
class AbstractWebPage:def __init__(self, cookie, use_cookie=True):if use_cookie:self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/80.0.3987.149 Safari/537.36','cookie': cookie}else:self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/80.0.3987.149 Safari/537.36'}self.sess = requests.session()self.sess.headers.update(self.headers)# 目录类,用来表示搜索结果
class Content(AbstractWebPage):def __init__(self, cookie, keyword, end_page):super(Content, self).__init__(cookie)start_url = 'https://search.jd.com/Search?keyword=' + keyword + '&enc=utf-8&wq=' + keywordself.url_list = [start_url + '&page=' + str(j) for j in range(1, end_page + 1)]self.end_page = end_pagedef print(self):print(self.url_list, sep='\n')def get_item_info(self):item_pages_list = []with open("good_info.txt", 'w', encoding='utf-8') as f:f.write("产品名称" + '\t' + '价格' + '\t' + '销量' + '\t' '店铺' + '\n')f.write("*" * 50 + '\n')for url in self.url_list:res = self.sess.get(url)res.encoding = 'utf-8'res = res.text# 定位搜索结果主体,并获取所有的商品的标签soup = BeautifulSoup(res, 'html.parser').select('#J_goodsList > ul')good_list = soup[0].select('[class=gl-i-wrap]')# 循环获取所有商品信息for temp in good_list:# 获取名称信息name_div = temp.select_one('[class="p-name p-name-type-2"]')good_info = name_div.text.strip() + '\t'# 价格信息price_div = temp.select_one('[class=p-price]')good_info += price_div.text.strip() + '\t'# 评价信息comment_div = temp.select_one('[class=p-commit]').find('strong').find('a')comment_url = comment_div.get('href')good_id = comment_url.replace('//item.jd.com/', '').replace('.html#comment', '')# 评价信息没有在主页面内,而是需要另外发送GET获取,服务器地址如下# 这里面的uuid是唯一标识符,如果运行程序发现报错或者没有得到想要的结果# commit_start_url = f'https://api.m.jd.com/?appid=item-v3&functionId' \#                    '=pc_club_productCommentSummaries&client=pc&clientVersion=1.0.0&t' \#                    f'=1711091114924&referenceIds={good_id}&categoryIds=9987%2C653%2C655' \#                    '&loginType=3&bbtf=&shield=&uuid=181111935.1679801589641754328424.1679801589' \#                    '.1711082862.1711087044.29'commit_start_url = f'https://api.m.jd.com/?appid=item-v3&functionId' \'=pc_club_productCommentSummaries&client=pc&clientVersion=1.0.0&t' \f'=1711091114924&referenceIds={good_id}&categoryIds=9987%2C653%2C655'# 发送请求,得到结果comment_res = self.sess.get(commit_start_url)# 编码方式是GBK国标编码comment_res.encoding = 'gbk'comment_res_json = comment_res.json()# 解析得到评论数量good_info += comment_res_json['CommentsCount'][0]['CommentCountStr'] + '\t'# 店铺信息shop_div = temp.select_one('[class=p-shop]')good_info += shop_div.get_text().strip() + '\t'f.write(good_info + '\n')f.write("*" * 50 + '\n')f.close()return item_pages_listif __name__ == "__main__":# cookie,用于验证登录状态,必须要有cookie,否则京东会提示网络繁忙请重试# 获取方法:使用浏览器登录过后按F12,点击弹出界面中最上方的network选项,name栏里面随便点开一个,拉到最下面就有cookie,复制到cookie.txt中# 注意,不要换行,前后不要有空格,只需要复制cookie的值,不需要复制“cookie:”这几个字符# 上面的看不懂的话,看这个:https://blog.csdn.net/qq_46047971/article/details/121694916# 然后就可以运行程序了cookie_str = ''with open('cookie.txt') as f:cookie_str = f.readline()# 输入cookie,关键词,输入结束页数content_page = Content(cookie_str, '手机', 2)content_page.print()urls = content_page.get_item_info()

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

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

相关文章

C#绘制面形图

创建windows窗体应用 ,从工具箱添加Button和Panel using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Fo…

draw.io 去除箭头

问题 draw.io 去除箭头 详细问题 笔者使用draw.io绘制流程图,需要没有箭头的连接器,但是General所提供的连接器添加了尾部箭头,如何取消尾部箭头? 解决方案 1、点击选中选择连接器(箭头1)。在格式面板的“Style…

【Transformer】transformer注解

every blog every motto: You can do more than you think. 0. 前言 transformer注解 在过去的一年里,《Attention is all you need》中的transformer一直萦绕在很多人的脑海里。除了在翻译质量上产生重大改进之外,它还为许多其他NLP任务提供了一种新的…

C++ 基本运算

何谓运算符和操作数 基本运算 1、双目运算 2、单目运算 3、赋值表达式 表达形式&#xff1a; <变量><表达式>; 表达式是指各种运算符把常量、变量&#xff0c;函数等运算对象连接起来的具有实际意义并符合C语法规则的式子。赋值是指表达式的值赋给一个变量。 …

手撕算法-删除链表的倒数第 N 个结点

描述 思路 快慢指针&#xff0c;快指针先走N步&#xff0c;走不够N步返回空。慢指针和快指针一起走&#xff0c;当快指针到达终点&#xff0c;即快指针为null时&#xff0c;慢指针到达倒数第N个节点。因为要删除倒数第N个&#xff0c;所以要记录之前的节点pre&#xff0c;假设…

python--list容器、列表

1.python官方内置的容器 list: set: tuple: dict: 弱数据类语言通通没有数组&#xff0c;因为数组指的是 类型固定、大小固定、连续的内存空间。 2.链表&#xff1a; 非连续内存空间 python用的是双向链表 单向链表&#xff1a;优点&#xff1a;不浪费内存&#xf…

vue文件上传

终端操作&#xff1a; koa2 -e upload cd upload npm install 目录&#xff1a; step1: views/index.ejs <!DOCTYPE html> <html><head><title><% title %></title><link rel"stylesheet" href"/stylesheets/style.c…

【Oracle】Linux——Centos7安装Oracle12c

安装前拍快照、安装前拍快照、安装前拍快照 目录 安装前拍快照、安装前拍快照、安装前拍快照1.下载Oracle12C安装包2.基本环境搭建2.1创建用户和组2.2创建oralce安装目录,oracle用户分配目录权限2.3上传安装包 3.系统参数配置及服务器设置3.1依赖安装3.2内核参数配置3.3配置完成…

6. ping在windows中的常见用法

&#xff08;1&#xff09;ping简介 1.ping简介 &#xff08;2&#xff09;在windows上用法 1.直接ping 对方IP&#xff08;无参数时&#xff09; 2.ping -t IP (长ping) 3.ping -n 包数量 4.ping -l 字节大小 IP 5.如何批量的ping一个网段&#xff1f; &#xff08;1&a…

4.1.1 SN74LVC125N型缓冲器/驱动器(三态门)

1、三态门介绍 三态门和普通逻辑门相比,增加了一只使能(选通)引脚,如下图所示。 (1)当三态门的使能引脚有效时,三态门按照正常的逻辑功能进行工作。 (2)当三态门的使能引脚处于无效电平时,三态门输出高阻态,与所连接电路断开。 常用的三态门有74HC125、74LVC125A…

删除字符串--给你一个字符串S,要求你将字符串中出现的所有“gzu“子串删除,输出删除之后的S。

输入描述: 输入一行字符串S&#xff0c;长度不超过100。 输出描述: 输出进行删除操作之后的S。 #include <stdio.h> #include <stdlib.h> #include <string.h>//结合了串的模式匹配算法思路int main(){char s[100];char a[3]{g,z,u};gets(s);int nstrlen…

【Prometheus】查询语法(PromQL)

文章目录 1. PromQL介绍1.1. 时间序列过滤器1.1.1. 瞬时向量过滤器1.1.2. 区间向量过滤器1.1.3. 时间位移操作1.2. 操作符1.2.1. 算术二元运算符1.2.2. 聚合操作1.3. 常用函数1.3.1. increase1.3.2. irate1.3.3. rate1. PromQL介绍 Prometheus 提供了一种功能表达式语言 PromQ…

项目解决方案:旅游景区4G/5G无线视频监控联网系统设计方案

目录 一、背景 二、系统设计 1.1 总体设计要求 1.2 系统架构设计说明 1.3 系统拓扑图 1.4 关键技术 1.4.1 5G支持技术 1.4.2 视频图像处理技术 1.4.3 数据融合与分析技术 三、功能特点 3.1 高效可靠 3.2 实时监测 3.3 远程控制 3.4 故障预测 四、应用前景 …

SAP BAS开发Fiori项目中的各种文件详解(manifest.json, package.json, ui5.yaml, i18n等)

1. 背景 在SAP BAS中新建好一个Fiori项目后&#xff0c;系统会自动生成一系列的文件&#xff0c;例如package.json, ui5.yaml, manifest.json, i18n等。对于不熟悉web应用程序开发的同学&#xff0c;这些文件理解起来会很困惑。 在这篇文章中&#xff0c;我会详细介绍这些文件…

Elasticsearch:将 ILM 管理的数据流迁移到数据流生命周期

警告&#xff1a;此功能处于技术预览阶段&#xff0c;可能会在未来版本中更改或删除。 Elastic 将努力解决任何问题&#xff0c;但技术预览版中的功能不受官方 GA 功能的支持 SLA 的约束。目前的最新版本为 8.12。 在本教程中&#xff0c;我们将了解如何将现有数据流&#xff0…

Replidec:使用朴素贝叶斯分类器从宏基因组数据中识别病毒生命周期

Replidec - Use naive Bayes classifier to identify virus lifecycle from metagenomics data | bioRxivReplidec - Use naive Bayes classifier to identify virus lifecycle from metagenomics data | bioRxiv 安装 docker pull denglab/replidec 使用 for i in *_vOT…

【算法】小强爱数学(迭代公式+数论取模)

文章目录 1. 问题2. 输入3. 输出4. 示例5. 分析6. 思路7. 数论&#xff0c;取模相关公式8. 数论&#xff0c;同余定理9. 代码 1. 问题 小强发现当已知 x y B xyB xyB以及 x y A xyA xyA时,能很轻易的算出 x n x_ {n} xn​ y n y_ {n} yn​ 的值.但小强想请你在已知A和B的…

Linux线程补充之——同步

一、Linux线程同步 ​ 同步是相对于竞争的概念&#xff1b; ​ 同步就是在保证安全的前提下啊&#xff0c;按照一定的顺序访问临界资源&#xff1b; ​ 所有的资源一定是先访问的临界资源&#xff0c;申请失败然后才进行排队的&#xff1b;互斥锁保证的是来访问的进程只允许…

《边缘计算:连接未来的智慧之桥》

随着物联网、5G等技术的快速发展&#xff0c;边缘计算作为一种新兴的计算模式&#xff0c;正逐渐引起人们的广泛关注。边缘计算通过将数据处理和存储功能放置在距离数据产生源头更近的位置&#xff0c;实现了更快速、更可靠的数据处理和交换&#xff0c;为各行各业带来了前所未…

【项目设计】基于MVC的负载均衡式的在线OJ

项目代码&#xff08;可直接下载运行&#xff09; 一、项目的相关背景 学习编程的小伙伴&#xff0c;大家对力扣、牛客或其他在线编程的网站一定都不陌生&#xff0c;这些编程网站除了提供了在线编程&#xff0c;还有其他的一些功能。我们这个项目只是做出能够在线编程的功能。…