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

作者:Chenjiabing 时间:2022-05-11 05:33:23 

前言

本文主要介绍的是利用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能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

来源:http://chenjiabing666.github.io6

标签:python,爬虫,京东
0
投稿

猜你喜欢

  • 客户端和服务端的编码“陷阱”

    2007-12-21 19:19:00
  • Python如何查看并打印matplotlib中所有的colormap(cmap)类型

    2023-12-05 11:04:28
  • 给SQL Server传送数组参数的变通办法

    2008-11-25 11:39:00
  • python实现简单的井字棋小游戏

    2022-06-30 10:48:05
  • mysql-8.0.15-winx64 解压版安装教程及退出的三种方式

    2024-01-23 21:56:20
  • 浅谈python锁与死锁问题

    2022-06-02 16:38:37
  • Python实现自动玩贪吃蛇程序

    2021-07-27 19:01:47
  • 虾米网今年三月所用加密解密函数

    2010-08-09 12:54:00
  • Python使用wxPython实现计算器

    2021-08-31 11:23:54
  • 使用 FFmpeg 命令拼接mp3音频文件异常问题及解决方法

    2022-03-03 07:51:48
  • python批量读取文件名并写入txt文件中

    2021-02-18 16:32:29
  • Yii框架引用插件和ckeditor中body与P标签去除的方法

    2024-05-11 09:25:19
  • JavaScript字典与集合详解

    2024-04-16 09:28:13
  • Python利用tkinter实现一个简易番茄钟的示例代码

    2021-03-02 17:20:59
  • vue组件实现可搜索下拉框扩展

    2024-05-28 15:41:57
  • vue3.0+vue-router+element-plus初实践

    2024-05-21 10:17:49
  • MySQL使用profile查询性能的操作教程

    2024-01-19 10:22:22
  • wxPython色环电阻计算器

    2023-12-21 20:08:54
  • 人工智能(AI)首选Python的原因解析

    2021-03-23 16:04:12
  • Win7或Windows server 2008中IIS7支持ASP+Access解决方法

    2012-03-27 18:31:27
  • asp之家 网络编程 m.aspxhome.com