摘要:以上只是一个普通的爬虫,并没有用到什么框架,接下来将会写框架爬取的,请继续关注我的博客哦本人博客
python大规模爬取京东 主要工具
分析步骤scrapy
BeautifulSoup
requests
代码讲解打开京东首页,输入裤子将会看到页面跳转到了这里,这就是我们要分析的起点
我们可以看到这个页面并不是完全的,当我们往下拉的时候将会看到图片在不停的加载,这就是ajax,但是当我们下拉到底的时候就会看到整个页面加载了60条裤子的信息,我们打开chrome的调试工具,查找页面元素时可以看到每条裤子的信息都在这个标签中,如下图:
接着我们打开网页源码就会发现其实网页源码只有前30条的数据,后面30条的数据找不到,因此这里就会想到ajax,一种异步加载的方式,于是我们就要开始抓包了,我们打开chrome按F12,点击上面的NetWork,然后点击XHR,这个比较容易好找,下面开始抓包,如下图:
从上面可以找到请求的url,发现有很长的一大段,我们试着去掉一些看看可不可以打开,简化之后的url=https://search.jd.com/s_new.p...{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框架爬取的,请继续关注我的博客哦!!!
本人博客文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/38603.html
摘要:,源代码爬取京东商品列表,以手机商品列表为例示例网址版本京东手机列表源代码下载位置请看文章末尾的源。,抓取结果运行上面的代码,就会爬取京东手机品类页面的所有手机型号价格等信息,并保存到本地文件京东手机列表中。 showImg(https://segmentfault.com/img/bVxXHW); 1,引言 在上一篇《python爬虫实战:爬取Drupal论坛帖子列表》,爬取了一个用...
摘要:,实验用的文件我们使用爬虫实战爬取京东商品列表一文的结果文件,爬虫爬取的结果保存在京东手机列表文件中。,相关文档,即时网络爬虫项目内容提取器的定义,爬虫实战爬取京东商品列表,集搜客开源代码下载源,开源网络爬虫源,文档修改历史,首次发布 showImg(https://segmentfault.com/img/bVyf6R); 1,引言 GooSeeker早在9年前就开始了Semanti...
摘要:,实验用的文件我们使用爬虫实战爬取京东商品列表一文的结果文件,爬虫爬取的结果保存在京东手机列表文件中。,相关文档,即时网络爬虫项目内容提取器的定义,爬虫实战爬取京东商品列表,集搜客开源代码下载源,开源网络爬虫源,文档修改历史,首次发布 showImg(https://segmentfault.com/img/bVyf6R); 1,引言 GooSeeker早在9年前就开始了Semanti...
摘要:这里由于京东的分界面都使用了,所以我们可以用,总之他们开发能用的选择器,我们都可以用,否则就不可以。 难道爬虫只能用 python 做? 不,我们上天的 Node.js 也可以做! 需要准备的包 Node.js的最新版本 下载地址 Node.js官网 npm 包管理器下载 下载最新的官网版本 Node.js 会自带 npm npm的第三方包 puppeteer 在对应...
摘要:这里由于京东的分界面都使用了,所以我们可以用,总之他们开发能用的选择器,我们都可以用,否则就不可以。 难道爬虫只能用 python 做? 不,我们上天的 Node.js 也可以做! 需要准备的包 Node.js的最新版本 下载地址 Node.js官网 npm 包管理器下载 下载最新的官网版本 Node.js 会自带 npm npm的第三方包 puppeteer 在对应...
阅读 2814·2021-11-25 09:43
阅读 2433·2021-10-09 09:44
阅读 2779·2021-09-22 15:49
阅读 2520·2021-09-01 11:43
阅读 2521·2019-08-30 14:16
阅读 427·2019-08-29 17:24
阅读 3007·2019-08-29 14:00
阅读 1357·2019-08-29 13:05