前言

这两天原本想在淘宝上爬点东西进行分析的,但没想到淘宝的反爬机制对我这个爬虫菜鸡充满了恶意。先是被数据的格式搞得焦头烂额,好不容易写好了测试一页的代码,准备美滋滋开始大显身手,爬取多页时,发现竟然被封IP了!呜呜┭┮﹏┭┮。于是,开始研究各种反反爬的机制,IP代理,多线程、模拟登陆… …发现自己的盲区越来越大。眼瞅着与自己的博客更新计划越行越远,只好先换个目标,对某东下手。但并不代表我会放过它,等自己在修炼一段时间,再来会会它。下面,我们开始进入正题吧。

这次想做一个关于糖果的分析,于是爬取了京东共2700左右条的数据,这个数据应该是够自己分析了。京东比较坑的一点是,他的每一页是先加载一部分,另一部分是通过动态加载的。为此,我的解决办法是,使用Selenium构建模拟浏览器,先通过执行脚本,下滑到底部,等全部数据加载完成后,在进行读取。哦,对了,这次使用的解析库是xpath。

要点

用到的库:selenium、urllib、pandas、csv、lxml

工具: python 3.7、jupyter notebook

分析

网页分析

首先,我们进入京东商城,搜索框中输入糖果,进入开发者模式。

发现这也太简单了叭,按捺不住内心的鸡冻,马上就想要开始写代码。

慢着

我们先看看Network的输出,

细细看一下Preview中的商品,如果你点一下,你会发现只有30个商品,而页面中共有60个商品,你会发现事情并不简单。

下滑到底部后,你在刷新下Network输出,你会发现,这里多了个这个js文件

而这里就是剩下的30条数据。

哦,我懂了,不就是先加载30条数据,后30条数据在你滑动浏览的过程中加载嘛。

这时候,我们前面介绍的主角就登场了:Selenium 。通过它,构建一个虚拟浏览器,先执行一个脚本,下滑到最底部,加载完数据后我们在进行爬取。

**注意:**使用他,你要先安装谷歌插件(谷歌浏览器的话),还得添加驱动。具体操作步骤,请移步百度。

url分析

分析完网页结构后,我们来分析下url的构成

前30条数据的

https://search.jd.com/Search?keyword=%E7%B3%96%E6%9E%9C&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&page=1&s=1&click=0

后30条数据的

https://search.jd.com/s_new.php?keyword=%E7%B3%96%E6%9E%9C&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=%E7%B3%96%E6%9E%9C&page=2&s=31&scrolling=y&log_id=1584362139.53979&tpl=1_M&show_items=100007265728,4695858,1227178,4838836,326467,100000424178,100000217809,1083784,4005567,1153605,1153613,4707850,1153610,1178879,4476739,794422,100008420904,100000757536,6338667,100004891346,4476767,30494640062,4491861,3816695,523631,4476753,2210373,679518,3692931,903403

发现两个中,前面构成是基本一致的,

keyword:搜索关键字

log_id:是后30个商品的商品id

经过实验,我们发现简化后可用的url:https://search.jd.com/Search?keyword=%E7%B3%96%E6%9E%9C&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&page=1&s=1&click=0

在看下第二页:

https://search.jd.com/Search?keyword=%E7%B3%96%E6%9E%9C&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&page=3&s=61&click=0

第三页 (此处省略100字) … …

得出url的规律: page = 2*页数 - 1

分析完这些后,就可以进行快乐的编码模式了

代码

直接上代码吧

import time
from selenium import webdriver
from  lxml import etree
import urllib
import csv
import pandas as pd
import random#获取页面
def get_page(depth):keyword = "糖果"headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"}base_url = 'https://search.jd.com/Search?keyword={}&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&stock=1&page={}'for page_num in range(1,depth):try:start_url = base_url.format(urllib.parse.quote(keyword),page_num*2-1)driver = webdriver.Chrome()driver.get(start_url) driver.execute_script("window.scrollTo(0,document.body.scrollHeight);")  #执行下滑到底部的操作time.sleep(10) #必须休眠,等待获取完全部信息#获取页面信息source = driver.page_source  #  等同于  response = requests.get(url = start_url,headers=headers)html = etree.HTML(source)item = parse_page(html)write_excel(item)print('爬取第'+str(page_num)+'页时成功!')time.sleep(random.randint(2,6))except:print('爬取第'+str(page_num)+'页时出错!')continue#解析页面
def parse_page(html):li = html.xpath('//*[@id="J_goodsList"]/ul/li')for one_li in li: yield{'price':one_li.xpath('div/div[2]/strong/i/text()')[0],'title':get_title(one_li),'comment_num':one_li.xpath('div/div[4]/strong/a/text()')[0],'shop' :get_shop(one_li),'goods_url':'http://'+one_li.xpath('div/div[1]/a/@href')[0]        }# #获取标题
def get_title(item):title_list = item.xpath('div/div[3]/a/em/text()')title = ' '.join(title_list)return title #获取店铺名称
def get_shop(item):shop=item.xpath('div/div[5]/span/a/text()')if len(shop) == 0:return '未知'else:return shop[0]#写入csv文件中
def write_excel(item):good_df = pd.DataFrame(item)good_df.to_csv('./JongDong.csv',mode='a',encoding= 'utf-8-sig')def main():get_page(50)if __name__ == "__main__":main()

运行结果:

嗯,很好,都爬取成功了

真的嘛?你不是说一页60,60*49 = 2940.你别欺负我读书少!!!

好吧,我承认是漏了些数据。但我发4,这绝对不是我代码的问题,我测试过爬取单页和爬前几页时是能够爬取完整的。真的只是我家网的问题,没来得及加载完全部数据。虽然我也设置了延时(休眠10s来获取数据),但可能这些时间里刚好碰上网卡情况。下午爬取时候,确实有段时间网特慢。下次,考虑加入retry,让它没爬取完整就重新爬,直到一页的数据爬取完整,变成一个真正合格的爬虫,同时,加入多线程,减少爬取的时间。再说,两千多条也足够用了,不是嘛。嘻嘻(●’◡’●)

后记

后面将用今天获得的数据进行分析,解锁糖果的密码。(●’◡’●)

用Selenium+xpath爬取京东商城相关推荐

  1. 【爬虫】用Selenium+PyQuery爬取京东商城

    文章目录 前言 1. 项目预览 2. 库的引入 3. 爬取流程 4. 驱动浏览器搜索关键字 4. 1页面分析 4.2 驱动浏览器代码 5. 解析页面 5.1 页面分析 5.2 页面解析代码 6. 保存 ...

  2. 爬虫利器Pyppeteer的介绍和使用 爬取京东商城书籍信息

    提起 selenium 想必大家都不陌生,作为一款知名的 Web 自动化测试框架,selenium 支持多款主流浏览器,提供了功能丰富的API 接口,经常被我们用作爬虫工具来使用.但是 seleniu ...

  3. 爬虫利器Pyppeteer的介绍和使用 爬取京东商城书籍信息!

    提起 selenium 想必大家都不陌生,作为一款知名的 Web 自动化测试框架,selenium 支持多款主流浏览器,提供了功能丰富的API 接口,经常被我们用作爬虫工具来使用.但是 seleniu ...

  4. Scrapy练习——爬取京东商城商品信息

    刚刚接触爬虫,花了一段时间研究了一下如何使用scrapy,写了一个比较简单的小程序,主要用于爬取京东商城有关进口牛奶页面的商品信息,包括商品的名称,价格,店铺名称,链接,以及评价的一些信息等.简单记录 ...

  5. python爬京东联盟_python爬虫框架scrapy实战之爬取京东商城进阶篇

    前言 之前的一篇文章已经讲过怎样获取链接,怎样获得参数了,详情请看python爬取京东商城普通篇,本文将详细介绍利用python爬虫框架scrapy如何爬取京东商城,下面话不多说了,来看看详细的介绍吧 ...

  6. 利用python爬虫爬取京东商城商品图片

    笔者曾经用python第三方库requests来爬取京东商城的商品页内容,经过解析之后发现只爬到了商品页一半的图片.(这篇文章我们以爬取智能手机图片为例) 当鼠标没有向下滑时,此时查看源代码的话,就会 ...

  7. python爬虫完整实例-python爬虫实战之爬取京东商城实例教程

    前言 本文主要介绍的是利用python爬取京东商城的方法,文中介绍的非常详细,下面话不多说了,来看看详细的介绍吧. 主要工具 scrapy BeautifulSoup requests 分析步骤 1. ...

  8. 爬虫python的爬取步骤-python爬虫实战之爬取京东商城实例教程

    前言 本文主要介绍的是利用python爬取京东商城的方法,文中介绍的非常详细,下面话不多说了,来看看详细的介绍吧. 主要工具 scrapy BeautifulSoup requests 分析步骤 1. ...

  9. python爬虫爬图片教程_python爬虫实战之爬取京东商城实例教程

    前言 本文主要介绍的是利用python爬取京东商城的方法,文中介绍的非常详细,下面话不多说了,来看看详细的介绍吧. 主要工具 scrapy BeautifulSoup requests 分析步骤 1. ...

最新文章

  1. Java断点续传(基于socket与RandomAccessFile的实现)
  2. 哈哈,咱们团队早就不用try-catch-finally关闭资源了!
  3. InnoDB多版本控制实现
  4. ubuntu 搜索文件方法(find命令)
  5. jmeter 核心_初识性能测试工具JMeter
  6. java jar包图片_jar包的图片不显示 求解
  7. 模拟分发扑克牌(python实现)
  8. Linux配置最基础的命令
  9. Mr.J-- jQuery学习笔记(十四)--动画显示隐藏
  10. python文件读写方法手机,python文本文件读写的3种方法
  11. python如何进行web开发_如何用Python做Web开发
  12. 2021年顶级服务器备份软件和解决方案
  13. 【课程作业|图论】第四章课后习题
  14. Java Socket设置timeout几种常用方式总结
  15. java后端getmonth_Java YearMonth getMonth()用法及代码示例
  16. switch 贯穿的妙用
  17. 人工智能AI讲师NLP培训讲师叶梓:人工智能之最新NLP自然语言处理技术与实战-23
  18. Python通过高德地图API批量计算两地路线距离
  19. Kubernetes Events介绍(下)
  20. 条码防伪检测技术介绍,如何通过扫描商品条码判断产品的真伪-鸿顺捷条码防伪技术介绍

热门文章

  1. 综述 | 图像计算传感器
  2. 天下文章一大抄 mysql远程连接
  3. python:pyqt5+mysql=学生信息管理系统(图文并茂,超详细)——登录,注册及找回密码篇
  4. HTML常用标签 选择器
  5. 地块电力监控系统的设计和应用
  6. 什么叫数据于程序的物理独立性?什么叫数据与程序的逻辑独立性?为什么数据库系统具有数据于程序的独立性?
  7. 13 ,CSS 入门基础,行内排版内嵌式排版和外部排版样式
  8. 怎么设置邮箱收发服务器
  9. mysql以及DBeaver的使用
  10. gitlab自动同步github