这次主要讲一下怎么分析ajax请求来获得我们想要的数据,在通过多进程进行抓取,当然这次的目的主要是这两个,所以最后的结果是以打印在控制台为主。

那么让我们开始这一次的爬虫之旅

我们先进入堆糖网,这次我们要爬取的是我的女神,新垣结衣的图片。

我们看到大致的页面长这样。需要注意的是我们在往下拉的过程会不断的加载出新的图片,也就是说我们没办法直接通过普通的request和bs4来得到我们想要的一整个页面的图片,更不用说翻页抓取了。

这是因为加载出来的图片时通过js渲染过的,属于动态网页,所以我们有两种方法,第一种可以用selenium,第二种就是我们今天要用的ajax。如果有对ajax不了解的,建议先看一下我的下一篇讲解ajax的博客再来看这一篇博客。

回到正题,老套路先按f12,点击network,勾选xhr,我们会看到以下的东西

这是我们要的xhr文件,出现这个文件的原因是我们不断的往下来然后加载出来的第一部分的图片,如果继续往下拉,还会不断的出现新的xhr文件。

下一步我们点击Preview,会看到以下东西

这些就是我们下拉时新加载出来的24张图片,这些图片都以json格式保存,我们要的图片在data里面的object_list里面,我们点开其中一个看一下,

看到photo里面path了吗,这个链接就是我们要找的图片链接。

我们知道我们是要通过发送ajax请求来获得数据的,那么这个请求要包含一些什么呢,我们看一下headers

我们看到URL需要的参数有kw,type,include_fields,start五个参数,那么每一个ajax请求之间的规律又是什么呢,当我们多加载几次的时候,我们发现参数里面的start总是发生了变化,并且是以24的幅度在变,这个是24,下一个请求里面的start就是48,以此类推。

那么找到规律后,我们就开始伪造ajax请求,代码长这样

def get_page(offset):      #offset为变动的参数,也就是startheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36','Referer': 'https://www.duitang.com/search/?kw=%E6%96%B0%E5%9E%A3%E7%BB%93%E8%A1%A3&type=feed','X-Requsted-With': 'XMLHttpRequest'}params = {                               #请求链接所需要的参数'kw': '新垣结衣','type': 'feed','include_fields': 'top-comments','start': offset,#'_': number}url = 'https://www.duitang.com/napi/blog/list/by_search/?' + urlencode(params)try:response = requests.get(url, headers=headers)if response.status_code == 200:return response.json()          #因为返回的是json数据,所以这里我们return response.json()except requests.ConnectionError:return None

得到我们要的json数据后,我们要来解析数据了,因为我们只要path,其他的不要。

所以有以下代码

def get_image(json):items = json.get('data')for item in items.get('object_list'):path = item.get('photo').get('path')print(path)print('Successes!')

每打印完一部分后用print('Successes!')来作为分割,到这里基本就差不多了,最后我们看一下怎么利用多进程进行操作。

START = 0
END = 10
if __name__ == '__main__':offsets = ([x * 24 for x in range(START,END + 1)])pool = Pool()                      #Pool是进程池,如果不给参数,则默认的进程数就是你的CPU核数pool.map(main,offsets)            #第一个参数为调用的方法名,第二个参数为改变的值pool.close()                      #不允许添加新的进程pool.join()                       #在子进程运行结束后父进程再结束end = time.clock()                #检测整个程序的运行时间print('time:{}'.format(end-start))      #打印运行时间

最后贴上完整代码

# -*- coding:utf-8 -*-
from multiprocessing import Pool
import requests
import json
import time
from urllib.parse import urlencodestart = time.clock()       #用来检测代码运行时间的
def get_page(offset):      #offset为变动的参数,也就是startheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36','Referer': 'https://www.duitang.com/search/?kw=%E6%96%B0%E5%9E%A3%E7%BB%93%E8%A1%A3&type=feed','X-Requsted-With': 'XMLHttpRequest'}params = {                               #请求链接所需要的参数'kw': '新垣结衣','type': 'feed','include_fields': 'top-comments','start': offset,#'_': number}url = 'https://www.duitang.com/napi/blog/list/by_search/?' + urlencode(params)try:response = requests.get(url, headers=headers)if response.status_code == 200:return response.json()except requests.ConnectionError:return None
def get_image(json):items = json.get('data')for item in items.get('object_list'):path = item.get('photo').get('path')print(path)print('Successes!')
def main(offset):json = get_page(offset)get_image(json)
START = 0
END = 10
if __name__ == '__main__':offsets = ([x * 24 for x in range(START,END + 1)])pool = Pool()                      #Pool是进程池,如果不给参数,则默认的进程数就是你的CPU核数pool.map(main,offsets)            #第一个参数为调用的方法名,第二个参数为改变的值pool.close()                      #不允许添加新的进程pool.join()                       #在子进程运行结束后父进程再结束end = time.clock()                #检测整个程序的运行时间print('time:{}'.format(end-start))      #打印运行时间

爬虫小项目(四)利用多进程和ajax技术爬取堆糖相关推荐

  1. 把url地址复制到粘贴板上_写个简单的python爬虫爬取堆糖上漂亮的小姐姐

    简单的爬虫入门实战 最近刚学了python的爬虫,刚好可以用来爬取漂亮的图片作为壁纸,网上美图网站有很多,比如:花瓣,堆糖.它们请求图片数据的方式差不多类似,都是通过用户不断下滑加载新的图片,这种请求 ...

  2. 《PYTHON3网络爬虫开发实践》——第六章 Ajax数据爬取

    第六章 Ajax数据爬取 有时候我们在用requests抓取页面的时候,得到的结果可能和在浏览器中看到的不一样:这是因为requests 获取的都是原始的HTML文档,而浏览器中的页面则是经过Java ...

  3. Python 爬虫小练习:基于 XPath 的表格信息爬取

    文章目录 确定目标和分析思路 目标 思路 观察情况 爬取名单表 爬取详情页二级信息 爬虫请遵守相关法律法规,不要做违法犯罪的事情 爬虫小技巧总结 这是一个 Python 爬虫的入门练习,我们通过 Re ...

  4. python网络爬虫学习笔记(十一):Ajax数据爬取

    文章目录 1.基本介绍 2.基本原理 3.实战 有时候我们在用requests抓取页面的时候,得到的结果可能和在浏览器中看到的不一样:在浏览器中可以看到正常显示的页面数据,但是使用requests得到 ...

  5. 分布式爬虫联系项目1–阳光热线网站的分布式爬取

    要爬取的目标网站地址:http://wz.sun0769.com/political/index/politicsNewest?id=1&page=1 要爬取的内容为问政标题和处理状态. 1. ...

  6. python3网络爬虫:爬取堆糖照片

    首先对页面进行点击分析,查看如片,分析url. # -*- coding: utf-8 -*-import requests import threading import urllib.parse# ...

  7. 爬虫练习3 爬取堆糖网校花照片

    知识点: 多线程的实现图片的下载及写入字符串高级查找了解动态加载和jsonrequest 的用法 获取数据的api'https://www.duitang.com/napi/blog/list/by_ ...

  8. python3 爬虫日记(三) 爬取堆糖动态加载网页

    1.分析:进入堆糖网后我们在分类找到插画绘画进入这个分类后发现好多图片,下拉后发现会有不断的图片刷新出来,这就是堆糖采用了动态加载网页. 2.用开发者工具(F12)分析:按一下F12,找到networ ...

  9. Python3 爬虫学习笔记 C03 【Ajax 数据爬取】

    Python3 爬虫学习笔记第三章 -- [Ajax 数据爬取] 文章目录 [3.1]Ajax 简介 [3.2]解析真实地址提取 [3.1]Ajax 简介 Ajax - Asynchronous Ja ...

最新文章

  1. c语言标识符的词法形式,C语言词法器实验.doc
  2. 数据库笔记14:处理事务与锁
  3. c# webclient 保存会话信息_会话保持机制cookie和session
  4. 一步一步写算法(之链表重合)
  5. 元胞计算机系统,元胞自动机
  6. Ubutnu中ln创建软连接失败
  7. WordPress搬家更换域名教程
  8. 谷歌人工智能背后的大脑:没有他就没有今天的谷歌AI
  9. kmeans算法经典案例C语言,kmeans聚类算法以及使用案例
  10. 转载:技术大停滞——范式春梦中的地球工业文明3:范式春梦外的阴影
  11. (一)计网五层模型概述
  12. python辅助脚本教程_Python简单实现阴阳师挂机脚本
  13. 游戏攻略 Re:LieF ~親愛なるあなたへ~ (relief给挚爱的你)
  14. js 禁用输入法(伪) / keydown返回false仍然可以输入的问题
  15. 数据库基础-以命令方式创建数据库
  16. Exception: Please shut down the controller which is running on port 6653:
  17. 双系统:Win10+Ubuntu(UEFI启动模式)
  18. 此文件是二进制文件或使用了不支持的文本编码_计算机的基本原理(组成、发展、DOS、交互、文件、进制、环境)...
  19. 腾讯云EMR HUE Openldap 配置
  20. ex1-linearRegression

热门文章

  1. AI助力多文档审查丨合同风险审查、招投标文件、合同和中标通知书一致性审查
  2. EPUB格式转PDF在线工具
  3. 《人生若只如初见》读后感
  4. 【数据分析】Matplotlib可视化最有价值的图表之——1、关联(Correlation)
  5. android设置为默认短信应用,android默认制作默认短信应用程序
  6. 双系统ubuntu 11.10 风扇一直转解决方案
  7. 【视频】波士顿动力最新“大黄蜂”版SpotMini机器人,被软银收购后走起萌路线...
  8. python爬虫爬取网页图片_Python爬虫:爬取网页图片
  9. python模拟Get请求保存网易歌曲的url
  10. html盒子模型多个盒子,css如何使用不同盒子模型