python爬虫实战之爬取京东商城实例教程


Posted in Python onApril 24, 2017

前言

本文主要介绍的是利用python爬取京东商城的方法,文中介绍的非常详细,下面话不多说了,来看看详细的介绍吧。

主要工具

  • scrapy
  • BeautifulSoup
  • requests

分析步骤

1、打开京东首页,输入裤子将会看到页面跳转到了这里,这就是我们要分析的起点

2、我们可以看到这个页面并不是完全的,当我们往下拉的时候将会看到图片在不停的加载,这就是ajax,但是当我们下拉到底的时候就会看到整个页面加载了60条裤子的信息,我们打开chrome的调试工具,查找页面元素时可以看到每条裤子的信息都在<li class='gl-item'></li>这个标签中,如下图:

python爬虫实战之爬取京东商城实例教程

3、接着我们打开网页源码就会发现其实网页源码只有前30条的数据,后面30条的数据找不到,因此这里就会想到ajax,一种异步加载的方式,于是我们就要开始抓包了,我们打开chrome按F12,点击上面的NetWork,然后点击XHR,这个比较容易好找,下面开始抓包,如下图:

python爬虫实战之爬取京东商城实例教程

4、从上面可以找到请求的url,发现有很长的一大段,我们试着去掉一些看看可不可以打开,简化之后的url=https://search.jd.com/s_new.php?keyword=%E8%A3%A4%E5%AD%90&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&offset=3&wq=%E8%A3%A4%E5%AD%90&page={0}&s=26&scrolling=y&pos=30&show_items={1}
这里的showitems是裤子的id,page是翻页的,可以看出来我们只需要改动两处就可以打开不同的网页了,这里的page很好找,你会发现一个很好玩的事情,就是主网页的page是奇数,但是异步加载的网页中的page是偶数,因此这里只要填上偶数就可以了,但是填奇数也是可以访问的。这里的show_items就是id了,我们可以在页面的源码中找到,通过查找可以看到id在li标签的data-pid中,详情请看下图

python爬虫实战之爬取京东商城实例教程

上面我们知道怎样找参数了,现在就可以撸代码了

代码讲解

1、首先我们要获取网页的源码,这里我用的requests库,安装方法为pip install requests,代码如下:

def get_html(self):
 res = requests.get(self.url, headers=self.headers)
 html = res.text 
 return html #返回的源代码

2、根据上面的分析可以知道,第二步就是得到异步加载的url中的参数show_items,就是li标签中的data-pid,代码如下:

def get_pids(self):
 html = self.get_html()
 soup = BeautifulSoup(html, 'lxml') #创建BeautifulSoup对象
 lis = soup.find_all("li", class_='gl-item') #查找li标签
 for li in lis:
  data_pid = li.get("data-pid")  #得到li标签下的data-pid
  if (data_pid):
   self.pids.add(data_pid) #这里的self.pids是一个集合,用于过滤重复的

3、下面就是获取前30张图片的url了,也就是主网页上的图片,其中一个问题是img标签的属性并不是一样的,也就是源码中的img中不都是src属性,一开始已经加载出来的图片就是src属性,但是没有加载出来的图片是data-lazy-img,因此在解析页面的时候要加上讨论。

代码如下:

def get_src_imgs_data(self):
 html = self.get_html()
 soup = BeautifulSoup(html, 'lxml')
 divs = soup.find_all("div", class_='p-img') # 图片
 # divs_prices = soup.find_all("div", class_='p-price') #价格
 for div in divs:
  img_1 = div.find("img").get('data-lazy-img') # 得到没有加载出来的url
  img_2 = div.find("img").get("src") # 得到已经加载出来的url
  if img_1:
   print img_1
   self.sql.save_img(img_1)
   self.img_urls.add(img_1)
  if img_2:
   print img_2
   self.sql.save_img(img_2)
   self.img_urls.add(img_2)

前三十张图片找到了,现在开始找后三十张图片了,当然是要请求那个异步加载的url,前面已经把需要的参数给找到了,下面就好办了,直接贴代码:

def get_extend_imgs_data(self):
 # self.search_urls=self.search_urls+','.join(self.pids)
 self.search_urls = self.search_urls.format(str(self.search_page), ','.join(self.pids)) #拼凑url,将获得的单数拼成url,其中show_items中的id是用','隔开的,因此要对集合中的每一个id分割,page就是偶数,这里直接用主网页的page加一就可以了
 print self.search_urls
 html = requests.get(self.search_urls, headers=self.headers).text #请求
 soup = BeautifulSoup(html, 'lxml') 
 div_search = soup.find_all("div", class_='p-img') #解析
 for div in div_search: 
  img_3 = div.find("img").get('data-lazy-img') #这里可以看到分开查找img属性了
  img_4 = div.find("img").get("src")
  if img_3: #如果是data-lazy-img
   print img_3
   self.sql.save_img(img_3) #存储到数据库
   self.img_urls.add(img_3)  #用集合去重
  if img_4: #如果是src属性
   print img_4
   self.sql.save_img(img_4)  
   self.img_urls.add(img_4)

4、通过上面就可以爬取了,但是还是要考虑速度的问题,这里我用了多线程,直接每一页面开启一个线程,速度还是可以的,感觉这个速度还是可以的,几分钟解决问题,总共爬取了100个网页,这里的存储方式是mysql数据库存储的,要用发哦MySQLdb这个库,详情自己百度。

当然也可以用mogodb,但是还没有学呢,想要的源码的朋友请看下面:

一、GitHub源码

二、本地下载

拓展总结

写到这里可以看到搜索首页的网址中keyword和wq都是你输入的词,如果你想要爬取更多的信息,可以将这两个词改成你想要搜索的词即可,直接将汉字写上,在请求的时候会自动帮你编码的,我也试过了,可以抓取源码的,如果你想要不断的抓取,可以将要搜索的词写上文件里,然后从文件中读取就可以了。以上只是一个普通的爬虫,并没有用到什么框架,接下来将会写scrapy框架爬取的,请继续关注三水点靠木哦!!!

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者使用python能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
深入解析Python中的线程同步方法
Jun 14 Python
Python实现的直接插入排序算法示例
Apr 29 Python
tensorflow saver 保存和恢复指定 tensor的实例讲解
Jul 26 Python
使用pytorch进行图像的顺序读取方法
Jul 27 Python
情人节快乐! python绘制漂亮玫瑰
Aug 18 Python
使用python实现mqtt的发布和订阅
May 05 Python
Python内置random模块生成随机数的方法
May 31 Python
Django stark组件使用及原理详解
Aug 22 Python
python实现的生成word文档功能示例
Aug 23 Python
树莓派安装OpenCV3完整过程的实现
Oct 10 Python
基于python计算滚动方差(标准差)talib和pd.rolling函数差异详解
Jun 08 Python
Python实现快速大文件比较代码解析
Sep 04 Python
python中urllib.unquote乱码的原因与解决方法
Apr 24 #Python
Python面向对象特殊成员
Apr 24 #Python
Python解惑之整数比较详解
Apr 24 #Python
Python解惑之True和False详解
Apr 24 #Python
Python新手入门最容易犯的错误总结
Apr 24 #Python
Python正则抓取新闻标题和链接的方法示例
Apr 24 #Python
Python的爬虫框架scrapy用21行代码写一个爬虫
Apr 24 #Python
You might like
DISCUZ 论坛管理员密码忘记的解决方法
2009/05/14 PHP
PHP实现扎金花游戏之大小比赛的方法
2015/03/10 PHP
WordPress开发中短代码的实现及相关函数使用技巧
2016/01/05 PHP
Laravel中的chunk组块结果集处理与注意问题
2018/08/15 PHP
javascript中的undefined 与 null 的区别  补充篇
2010/03/17 Javascript
javascript cookie操作类的实现代码小结附使用方法
2010/06/02 Javascript
js判断undefined变量类型使用typeof
2013/06/03 Javascript
js隐式全局变量造成的bug示例代码
2014/04/22 Javascript
Javascript检查图片大小不要让大图片撑破页面
2014/11/04 Javascript
jQuery实现长按按钮触发事件的方法
2015/02/02 Javascript
Jquery注册事件实现方法
2015/05/18 Javascript
EasyUI在表单提交之前进行验证的实例代码
2016/06/24 Javascript
jQuery遮罩层实例讲解
2017/05/11 jQuery
解决vue this.$forceUpdate() 处理页面刷新问题(v-for循环值刷新等)
2018/07/26 Javascript
11个教程中不常被提及的JavaScript小技巧(推荐)
2019/04/17 Javascript
JavaScript中的各种宽高属性的实现
2020/05/08 Javascript
vue实现循环滚动列表
2020/06/30 Javascript
Python编程中的for循环语句学习教程
2015/10/14 Python
python dict 字典 以及 赋值 引用的一些实例(详解)
2017/01/20 Python
Python 实现一行输入多个值的方法
2018/04/21 Python
在python下读取并展示raw格式的图片实例
2019/01/24 Python
Python类的继承、多态及获取对象信息操作详解
2019/02/28 Python
解决Pycharm双击图标启动不了的问题(JetBrains全家桶通用)
2020/08/07 Python
Python大批量搜索引擎图像爬虫工具详解
2020/11/16 Python
Html5实现文件异步上传功能
2017/05/19 HTML / CSS
美国奢侈品在线团购网站:Gilt City
2017/11/16 全球购物
吉力贝官方网站:Jelly Belly
2019/03/11 全球购物
美体小铺法国官方网站:The Body Shop法国
2020/06/04 全球购物
六查六看自查材料
2014/02/17 职场文书
聚美优品的广告词
2014/03/14 职场文书
高级工程师英文求职信
2014/03/19 职场文书
2014年共青团工作总结
2014/12/10 职场文书
创业计划书之韩国烧烤店
2019/09/19 职场文书
基于nginx实现上游服务器动态自动上下线无需reload的实现方法
2021/03/31 Servers
MySQL官方导出工具mysqlpump的使用
2021/05/21 MySQL
Python OpenCV超详细讲解读取图像视频和网络摄像头
2022/04/02 Python