利用Python爬虫爬取京东商品的简要信息

转自本人博客园博客:https://www.cnblogs.com/JYU-hsy/p/9673454.html

目录

一、前言

二、何为爬虫

三、JD商品详情页的网页分析

  3.1详情页上指向的其他URL

  3.2商品名称、价格

四、简单爬虫框架

  1.爬虫总调度程序

  2.URL管理器

  3.HTML下载器

  4.HTML解析器

  5.输出程序

五、源码


一、前言

  本文适合有一定Python基础的同学学习Python爬虫,无基础请点击:慕课网——Python入门
  申明:实例的主体框架来自于慕课网——Python开发简单爬虫

  语言:Python2

  IDE:VScode

二、何为爬虫

  传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,然后下载队列中的URL地址对应的网页。解析后抓取网页内容,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。同时,它还会根据一定的搜索策略获取我们所需的信息并保存下来。最后为了展示我们爬到的数据,往往还会用HTML的表格或记事本保存我们所需要的数据。
  简单来说,爬虫就是一门用来从互联网上自动获取我们所需数据的技术。

 

三、JD商品详情页的网页分析

  入口URL选择为JD某商品详情页:https://item.jd.com/4224129.html

  我们需要分析的内容主要有:

  3.1详情页上指向的其他URL

    我们打开https://item.jd.com/4224129.html,发现网页上还有很多指向其他商品的链接。

    

    

    通过鼠标右键,查看元素,我们可以发现商品页面上的以上链接均为以下格式: //item.jd.com/数字.html

    

    分析到此,我们就知道抓取网页内容时,从当前页面上抽取新的URL的方法了。

 

  3.2商品名称、价格

  同理,我们在商品名称和价格处点击鼠标右键查看元素

  

      


四、简单爬虫框架

  1.爬虫总调度程序

    即我们的main文件,以入口URL为参数爬取所有相关页面

  2.URL管理器

    维护待爬取和已爬取的URL列表

  3.HTML下载器

    主要功能是下载指定的url,这里用到了urllib2

  4.HTML解析器

    主要功能是获取网页上所需的URL和内容,用到BeautifulSoup

    正则表达式的基础知识可以参见

    re模块(正则表达式) - 人生不如戏 - 博客园

    另外安利一个网站,在写正则表达式的时候可以先测试,很实用

    正则表达式在线测试

  5.输出程序

    将爬取到的数据写入HTML文件中,利用HTML的table展示

 

五、源码

1.爬虫总调度程序

import url_manager, html_downloader, html_parser, html_outputerclass SpiderMain(object):def __init__(self):self.urls = url_manager.UrlManager()self.downloader = html_downloader.Html_DownloaDer()self.parser = html_parser.HtmlParser()self.outputer = html_outputer.HtmlOutputer()#爬虫调度程序def craw(self, root_url):count = 1#入口URL添加进URL管理器 self.urls.add_new_url(root_url)#启动循环,获取待扒取的URL,然后交给下载器下载页面,调用解析器解析页面while self.urls.has_new_url():try:new_url = self.urls.get_new_url()print 'craw',count, ':' ,new_urlhtml_cont = self.downloader.download(new_url)#得到新的URL列表和内容new_urls, new_data = self.parser.parse(new_url,html_cont)#新的URL存到URL管理器,同时进行数据的收集self.urls.add_new_urls(new_urls)self.outputer.collect_data(new_data)if count == 10:breakcount = count +1except:print 'craw dailed'#调用output_html展示爬取到的数据self.outputer.output_html()if __name__ == "__main__":#入口URLroot_url = "https://item.jd.com/4224129.html"obj_spider = SpiderMain()#启动爬虫obj_spider.craw(root_url)

 

2.URL管理器

class UrlManager(object):def __init__(self):#未爬取URL列表,已爬取URL列表self.new_urls = set()self.old_urls = set()#判断管理器中是否有新的待扒取的URLdef has_new_url(self):return len(self.new_urls) != 0#获取一个新的待扒取的URLdef get_new_url(self):#pop方法:获取列表中的一个URL并移除它new_url = self.new_urls.pop()self.old_urls.add(new_url)return new_url#向管理器添加一个新的URLdef add_new_url(self, url):if url is None:return#发现新的未添加的URL,则加入待扒取URL列表if url not in self.new_urls and url not in self.old_urls:self.new_urls.add(url)#向管理器添加批量个新的URLdef add_new_urls(self, urls):if urls is None or len(urls) == 0:returnfor url in urls:self.add_new_url(url)

 

  3.HTML下载器

import urllib2class Html_DownloaDer():def download(self, url):if url is None:return None#调用urllib2库的urlopen方法获取 类文件对象(fd) response""" response = urllib2.urlopen(url)"""#调用urllib2库的Request方法创建request对象request = urllib2.Request(url)#添加数据request.add_data('a')#添加htp和header(伪装成浏览器)request.add_header('User-Agent','Mozilla/5.0')#发送请求获取结果response = urllib2.urlopen(request)#获取状态码,200表示成功if response.getcode() != 200:return Nonereturn response.read()

 

  4.HTML解析器

from bs4 import BeautifulSoup
import re
import urlparseclass HtmlParser(object):def _get_new_urls(self, page_url, soup):new_urls = set()#获取所有的链接#格式如:<a target="_blank" title="华为(HUAWEI)..." href="//item.jd.com/12943624333.html">links = soup.find_all('a',href = re.compile(r"//item.jd.com/\d+\.htm"))#遍历转化为完整的URLfor link in links:new_url = link['href']new_full_url = urlparse.urljoin(page_url,new_url)#将结果存到一个新的列表里new_urls.add(new_full_url)return new_urlsdef _new_data(self, page_url, soup):res_data = {}#URLres_data['url'] = page_url#匹配标题#<div class="sku-name">华为(HUAWEI) MateBook X 13英寸超轻薄微边框笔记本(i5-7200U 4G 256G 拓展坞 2K屏 指纹 背光 office)灰</div>title_node = soup.find('div',class_ = "sku-name")res_data['title'] = title_node.get_text()#匹配价格#<div class="dd">#<span class="p-price"><span>¥</span><span class="price J-p-7430495">4788.00</span></span>"""下载的网页源码无价格信息<span class="price J-p-7430495"></span></span>!!!!!"""                                                                                                 price_node = soup.find('span',class_ = re.compile(r"price\sJ\-p\-\d+"))res_data['price'] =price_node.get_text()return res_datadef parse(self, page_url, html_cont):if page_url is None or html_cont is None:returnsoup = BeautifulSoup(html_cont,'html.parser')new_urls = self._get_new_urls(page_url,soup)_new_data = self._new_data(page_url,soup)return new_urls, _new_data

 

  5.输出程序

class HtmlOutputer(object):def __init__(self):self.datas = []def collect_data(self,data):if data is None:returnself.datas.append(data)def output_html(self):fout = open('output.html','w')fout.write("<html>")fout.write("<head>")fout.write('<meta charset="UTF-8">')        fout.write("<body>")fout.write("<table>")#python默认编码是ascii,中文可能会乱码,故加上encode('utf-8')for data in self.datas:fout.write("<tr>")fout.write("<td>%s</td>" % data['url'])fout.write("<td>%s</td>" % data['title'].encode('utf-8'))fout.write("<td>%s</td>" % data['price'].encode('utf-8'))fout.write("</tr>")fout.write("</table>")fout.write("</body>")fout.write("</head>")fout.write("</html>")

 

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

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

相关文章

智能车浅谈——抗干扰技术软件篇

文章目录 软件抗干扰技术数字信号的抗干扰措施数字输入信号软件抗干扰措施数字输出信号软件抗干扰措施数字滤波算术平均值滤波中值滤波滑动平均滤波归一化差比和 CPU及程序的抗干扰措施复位掉电保护Watchdog技术 总结智能车系列文章汇总 软件抗干扰技术 前面介绍了一些硬件抗干…

人工智能中RPA、NLP、OCR介绍

1、NLP 自然语言处理( Natural Language Processing, NLP)是计算机科学领域与人工智能领域中的一个重要方向。主要研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理是一门融语言学、计算机、于一体的。因此&#xff0c;这一领域的研究将涉及自然…

最新php在线扒站程序源码分享

介绍&#xff1a; 目前很火的在线扒站程序&#xff0c;免服务器&#xff0c;全站整体无shua新&#xff0c;很友好。 搭建说明&#xff1a; 上传到服务器/虚拟主机即可&#xff0c;无需数据库&#xff0c;仅占180k&#xff0c;ajax.php有能力的修改&#xff0c;index.html看到版…

凭什么国内造不出高端示波器?一起扒一扒示波器的发展史!

我是小麦&#xff0c;一名热爱电子技术的工程师 关注我&#xff0c;一起变得更加优秀&#xff01; 示波器作为电测行业最基本的综合性仪器&#xff0c;设计和制造他所涉及的领域也十分广泛,从半导体到特种材料&#xff0c;从机加工到电子设计无所不涉及。这就需要强大完善的工业…

掌握这些,你也可以轻松扒谱(下)

如果你只想要扒取歌曲的演唱旋律&#xff0c;那只需要看《掌握这些&#xff0c;你也可以轻松扒谱&#xff08;上&#xff09;》这篇文章就可以啦~ 但是如果你需要扒取音乐的伴奏&#xff0c;那就需要观看下方的内容继续学习啦~ 1.练习听分解和弦 如果我们想扒取歌曲的伴奏旋律…

【计算机视觉】pycharm自制一个吉他扒谱软件(附源码)

【计算机视觉】pycharm自制一个吉他扒谱软件&#xff08;附源码&#xff09; 构思起源结果展示吉他音频和图片附件可以从我的git上下载源码 构思起源 作为一个深度吉他爱好者&#xff0c;拥有一个自制的扒谱软件真是梦寐以求的事情&#xff0c;以前扒谱还要手画六线谱&#xf…

在线扒站源码

介绍&#xff1a; 上传就可以用 网盘下载地址&#xff1a; http://kekewl.org/zT7gE9VEwUT 图片&#xff1a;

如果你不会扒谱,来吧,这款软件给你超能力

我大学时期同寝室的一个同学&#xff0c;弹得一手好吉他。最让我们佩服的事&#xff0c;可以把任意一首歌的歌谱扒出来&#xff01;每年联欢会&#xff0c;我们选个歌&#xff0c;他就能很快把谱子扒出来&#xff0c;大家就可以拿着各种乐器开始准备表演节目。这个技能一直让我…

想要快速扒谱?快来掌握这些小技巧吧!

相信喜欢音乐的小伙伴们都遇见过这样的事情&#xff0c;有时候我们听到了一手非常好听的歌曲&#xff0c;自己也想要翻唱它&#xff0c;结果在网上找了半天&#xff0c;也没有找到这首歌曲的谱子&#xff0c;于是我们只能非常遗憾的错过了它。 这时候我们不妨来卷起袖子试试自己…

听音扒谱app_掌握这些,你也可以轻松扒谱(下)

如果你只想要扒取歌曲的演唱旋律&#xff0c;那只需要看《掌握这些&#xff0c;你也可以轻松扒谱(上)》这篇文章就可以啦~ 但是如果你需要扒取音乐的伴奏&#xff0c;那就需要观看下方的内容继续学习啦~ 图片来自EarMaster中文官网 1.练习听分解和弦 如果我们想扒取歌曲的伴奏旋…

AutoGPT 安装指南,使用避坑要点

最近&#xff0c; AIGC 中最火的可能就当属于 AutoGPT 了吧&#xff0c;首先简单介绍一下AutoGPT 背景 AutoGPT 是基于 ChatGPT API 接口开发&#xff0c;项目首推 GPT-4 模型&#xff0c;但 OpenAI 账号 API 只有 gpt-3.5-turo 权限同样也可以使用。 项目在 github 上获取的…

Langchain使用OpenAPI过程中报错openai.error.RateLimitError

Langchain使用OpenAPI过程中报错openai.error.RateLimitError 在使用agent跑demo时突然出现以下情况 最后抛出异常&#xff1a; openai.error.RateLimitError: You exceeded your current quota, please check your plan and billing details.通过查阅官方文档发现原因所在&…

【第二周】卷积神经网络

【第二周】卷积神经网络 学习专知课程《卷积神经网络》&#xff0c;主要内容包括&#xff1a; CNN的基本结构&#xff1a;卷积、池化、全连接典型的网络结构&#xff1a;AlexNet、VGG、GoogleNet、ResNet 1.代码练习 MNIST 数据集分类&#xff1a;构建简单的CNN对 mnist 数…

failed to load response

原因&#xff1a; 因为后端没有把跨域的相关信息写到Header&#xff0c;导致前端无法加载数据。 分析&#xff1a; 1、首先先查看项目中有没有配跨域相关的配置&#xff0c;然后发现有配。 2、这个应该是在执行controller的时候返回才会加上。 3、因为我们项目做了个拦截器…

前端请求failed to load response解决方案

情况是这样的&#xff0c;vue写的一个前端页面&#xff0c;写了一个上传图片的功能&#xff0c;在生产环境上是可以使用的&#xff0c;但在测试环境上不可用&#xff0c;所以开始找原因。 第一步 打开浏览器&#xff0c;查看网页代码&#xff0c;走到network页面开始抓包。 …

任务一 唐诗赏析软件

&#xff08;1&#xff09;TextView控件详解 在Android中&#xff0c;文本框使用TextView表示&#xff0c;作用是在界面上显示文本。TextView提供了大量的XML属性&#xff0c;通过这些属性值的设置可以控制其显示内容的外观。表2-1显示了TextView常见的XML属性说明。TextView的…

若依框架 项目运行报错问题

前端项目启动报错 Syntax Error: TypeError: eslint.CLIEngine is not a constructor stackoverflow上的解决方法 1&#xff09;升级webstorm 到2019版本 2&#xff09;降级eslint 到5 我选择 2) 代码如下 npm install --save-dev eslint5安装报错 1、npm audit fix 2、npm a…

大爆发还是大崩盘?亿万富翁Bankman-Fried解读NFT

iNFTnews.com消息&#xff0c;在接受CNBC采访时&#xff0c;加密衍生品交易所 FTX 的首席执行官 Sam Bankman-Fried 表示NFT几乎比他见过的任何东西都更快地成为主流。他还指出&#xff1a;“快速采用一种新趋势既让人兴奋&#xff0c;也存在风险。” “Visa刚刚宣布他们购买了…

AI工具究竟是帮手还是对手?

本文概要 近日育碧开发了人工智能工具 Ghostwriter&#xff0c;可以一键生成游戏NPC对话。不少游戏开发者担心AI写手工具的出现会让自己“饭碗”不保&#xff0c;但Swanson表示这个工具只是为了提供第一稿的 barks来减少对话生成工作的繁琐度。AI工具究竟是帮手还是对手&#x…

【自然语言处理】【大模型】DeepMind的大模型Gopher

DeepMind的大模型Gopher 《Scaling Language Models: Methods, Analysis & Insights from Training Gopher》 论文&#xff1a;https://arxiv.org/pdf/2112.11446.pdf 相关博客 【自然语言处理】【大模型】CodeGeeX&#xff1a;用于代码生成的多语言预训练模型 【自然语言处…