python大规模爬取京东
python大规模爬取京东
主要工具
scrapy
BeautifulSoup
requests
分析步骤
- 打开京东首页,输入裤子将会看到页面跳转到了这里,这就是我们要分析的起点
- 我们可以看到这个页面并不是完全的,当我们往下拉的时候将会看到图片在不停的加载,这就是
ajax
,但是当我们下拉到底的时候就会看到整个页面加载了60条裤子的信息,我们打开chrome的调试工具,查找页面元素时可以看到每条裤子的信息都在<li class='gl-item'></li>
这个标签中,如下图:
- 接着我们打开网页源码就会发现其实网页源码只有前30条的数据,后面30条的数据找不到,因此这里就会想到ajax,一种异步加载的方式,于是我们就要开始抓包了,我们打开chrome按F12,点击上面的NetWork,然后点击XHR,这个比较容易好找,下面开始抓包,如下图:
- 从上面可以找到请求的url,发现有很长的一大段,我们试着去掉一些看看可不可以打开,简化之后的
url
='https://search.jd.com/s_new.php?keyword=裤子&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&offset=3&wq=裤子&page={0}&s=26&scrolling=y&pos=30&show_items={1}',这里的showitems是裤子的id,page是翻页的,可以看出来我们只需要改动两处就可以打开不同的网页了,这里的page很好找,你会发现一个很好玩的事情,就是主网页的page是奇数,但是异步加载的网页中的page是偶数,因此这里只要填上偶数就可以了,但是填奇数也是可以访问的。这里的show_items
就是id
了,我们可以在页面的源码中找到,通过查找可以看到id
在li
标签的data-pid
中,详情请看下图
- 上面我们知道怎样找参数了,现在就可以撸代码了
代码讲解
- 首先我们要获取网页的源码,这里我用的requests库,安装方法为
pip install requests
,代码如下:
def get_html(self):
res = requests.get(self.url, headers=self.headers)
html = res.text
return html #返回的源代码
- 根据上面的分析可以知道,第二步就是得到异步加载的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是一个集合,用于过滤重复的
- 下面就是获取前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)
- 通过上面就可以爬取了,但是还是要考虑速度的问题,这里我用了多线程,直接每一页面开启一个线程,速度还是可以的,感觉这个速度还是可以的,几分钟解决问题,总共爬取了
100
个网页,这里的存储方式是mysql
数据库存储的,要用发哦MySQLdb
这个库,详情自己百度,当然也可以用mogodb但是还没有学呢,想要的源码的朋友请看GitHub源码
拓展
写到这里可以看到搜索首页的网址中keyword
和wq
都是你输入的词,如果你想要爬取更多的信息,可以将这两个词改成你想要搜索的词即可,直接将汉字写上,在请求的时候会自动帮你编码的,我也试过了,可以抓取源码的,如果你想要不断的抓取,可以将要搜索的词写上文件里,然后从文件中读取就可以了。以上只是一个普通的爬虫,并没有用到什么框架,接下来将会写scrapy
框架爬取的,请继续关注我的博客哦!!!
python大规模爬取京东的更多相关文章
- python爬虫爬取京东、淘宝、苏宁上华为P20购买评论
爬虫爬取京东.淘宝.苏宁上华为P20购买评论 1.使用软件 Anaconda3 2.代码截图 三个网站代码大同小异,因此只展示一个 3.结果(部分) 京东 淘宝 苏宁 4.分析 这三个网站上的评论数据 ...
- Python爬虫-爬取京东商品信息-按给定关键词
目的:按给定关键词爬取京东商品信息,并保存至mongodb. 字段:title.url.store.store_url.item_id.price.comments_count.comments 工具 ...
- JS+Selenium+excel追加写入,使用python成功爬取京东任何商品~
之前一直是requests库做爬虫,这次尝试下使用selenium做爬虫,效率不高,但是却没有限制,文章是分别结合大牛的selenium爬虫以及excel追加写入操作而成,还有待优化,打算爬取更多信息 ...
- Python 爬虫-爬取京东手机页面的图片
具体代码如下: __author__ = 'Fred Zhao' import requests from bs4 import BeautifulSoup import os from urllib ...
- Python爬虫实战(2):爬取京东商品列表
1,引言 在上一篇<Python爬虫实战:爬取Drupal论坛帖子列表>,爬取了一个用Drupal做的论坛,是静态页面,抓取比较容易,即使直接解析html源文件都可以抓取到需要的内容.相反 ...
- python制作爬虫爬取京东商品评论教程
作者:蓝鲸 类型:转载 本文是继前2篇Python爬虫系列文章的后续篇,给大家介绍的是如何使用Python爬取京东商品评论信息的方法,并根据数据绘制成各种统计图表,非常的细致,有需要的小伙伴可以参考下 ...
- python使用requests库爬取网页的小实例:爬取京东网页
爬取京东网页的全代码: #爬取京东页面的全代码 import requests url="https://item.jd.com/2967929.html" try: r=requ ...
- 使用Python 爬取 京东 ,淘宝。 商品详情页的数据。(避开了反爬虫机制)
以下是爬取京东商品详情的Python3代码,以excel存放链接的方式批量爬取.excel如下 代码如下 from selenium import webdriver from lxml import ...
- 一个scrapy框架的爬虫(爬取京东图书)
我们的这个爬虫设计来爬取京东图书(jd.com). scrapy框架相信大家比较了解了.里面有很多复杂的机制,超出本文的范围. 1.爬虫spider tips: 1.xpath的语法比较坑,但是你可以 ...
随机推荐
- java并发程序——Excutor
概述 Excutor这个接口用的不多,但是ThreadPoolExcutor这个就用的比较多了,ThreadPoolExcutor是Excutor的一个实现.Excutor体系难点没有,大部分的关键点 ...
- 2017TSC世界大脑与科技峰会,多角度深入探讨关于大脑意识
TSC·世界大脑与科技峰会是全世界范围内的集会,多角度深入探讨关于大脑意识体验来源这一根本话题,我们是谁,现实的本质是什么,我们所处宇宙空间的本质为何.该峰会由亚利桑那大学意识研究中心主办. 会议时间 ...
- 结构体的vector resize()与初始化
序: 我们在使用vector的时候可以自定义里面的数据类型.例如这样: struct Edge{ int from; int to; int weight; }; vector<Edge> ...
- php实现‘浏览记录’按日期分组
出题:现有测试数据如下,要求实现如下图中的效果: array(4) { [0] => array(6) { ["visit_id"] => int(127) [&quo ...
- NUMBER_GET_NEXT 获取编号 遇到关于按年度编号的问题
最近给财务做了一个平台,在系统创建一些特殊类型的合同,需要生成合同编号:财务要求 合同类型+公司代码 +年+三位流水号, eg:CP6008-2017001 SNRO 子对象数据元素就是 公司代码 不 ...
- JAVA CyclicBarrier类详解
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时CyclicBarrie ...
- Alamofire源码解读系列(十二)之请求(Request)
本篇是Alamofire中的请求抽象层的讲解 前言 在Alamofire中,围绕着Request,设计了很多额外的特性,这也恰恰表明,Request是所有请求的基础部分和发起点.这无疑给我们一个Req ...
- 自己实现的一个简单的EF框架(反射实现)
我实现了一个简单的EF框架,主要用于操纵数据库.实现了对数据库的基本操纵--CRUD 这是项目结构 这是一个 core 下的 DLL 写了一个数据库工厂,用于执行sql语句.调用sql语句工厂 写了一 ...
- 基于本地文件系统的LocalDB
零.前言 之前写一些小工具的时候,需要用到数据存储方面的技术,但是用数据库又觉得太大了,本地文件存储txt文件存储又不是很规范,于是乎想到了去编写一个简单的基于本地文件系统的数据存储库,暂且叫它loc ...
- Vmware报错:此主机支持IntelVTx 但IntelVTx处于禁用状态
"此主机支持IntelVTx 但IntelVTx处于禁用状态",报错原因:电脑未开启虚拟化 解决方案: 电脑关机(是关机不是重启)--开机,进BIOS --选择 configura ...