分析ajax请求格式,模拟发送http请求,从而获取网页代码,进而分析取出需要的数据和图片。这里分析ajax请求,获取cosplay美女图片。

登陆今日头条,点击搜索,输入cosplay


下面查看浏览器F12,点击XHR,这里能截取ajax请求,由于已经请求过该页面,所以点击F5,刷新,如下图

下面我们点击name下的链接,查看headers看到请求信息

可以看到请求的url为
https://www.toutiao.com/search_content/?offset=0&format=json&keyword=cosplay&autoload=true&count=20&cur_tab=1&from=search_tab&pd=synthesis
offset为0,表示当前页面的偏移量,我试着向下滑动页面,name下加载出很多连接,offset每次递增20,keyword为cosplay,是我们搜索的关键词,count表示图集的数量,其他的都不变。
所以我们可以构造一个http请求,包含上面的格式。接下来看看preview的内容

data就是页面加载出来的图片文章列表
点击其中一个data,查看

可以看得出图片列表和large图片相差的就是list和large的区别,如
http://p1-tt.bytecdn.cn/list/97e000601ee89d997af"为缩略图
http://p1-tt.bytecdn.cn/large/97e000601ee89d997af"为大图
所以只需将list替换为larg即可。之后发送http请求,获取对应的图片即可。下面为完整代码

  1. import requests
  2. import re
  3. import time
  4. from pyquery import PyQuery as pq
  5. from urllib.parse import urlencode
  6. import os
  7. USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0'
  8. COOKIES = r'UM_distinctid=167005cc741184-02d14e2fd49b05-10724c6f-1fa400-167005cc74263a; uuid="w:5a4841d5dda248c389f83e5b9c57608a"; sso_uid_tt=45b83f6c549dabd4248c611aa98222d3; toutiao_sso_user=4853db5c812f7bcb367cdcbef0967d06; sso_login_status=1; login_flag=54c7da4daac99058f7b6e4b8975cca01; sessionid=5e86f286970804ed8fd11abf0bf328e4; uid_tt=dd5e177a1cbf9746eb634307d64afd22; sid_tt=5e86f286970804ed8fd11abf0bf328e4; sid_guard="5e86f286970804ed8fd11abf0bf328e4|1541899310|15552000|Fri\054 10-May-2019 01:21:50 GMT"; tt_webid=6622406673465067021; WEATHER_CITY=%E5%8C%97%E4%BA%AC; cp=5BE7386A29798E1; tt_webid=75478811657; __tasessionId=qwly22e8r1541906736076; CNZZDATA1259612802=1520919144-1541896080-https%253A%252F%252Fwww.baidu.com%252F%7C1541901480; csrftoken=b970f054ea259eb162e572217e6756ca'
  9. REFER = 'https://www.toutiao.com/search/?keyword=cosplay'
  10. class AjaxScrapy(object):
  11. def __init__(self,pages=1):
  12. try:
  13. self.m_session = requests.Session()
  14. self.m_headers = {'User-Agent':USER_AGENT,
  15. 'referer':REFER,
  16. }
  17.  
  18. self.m_cookiejar = requests.cookies.RequestsCookieJar()
  19. self.dirpath = os.path.split(os.path.abspath(__file__))[0]
  20. for cookie in COOKIES.split(';'):
  21. key,value = cookie.split('=',1)
  22. self.m_cookiejar.set(key,value)
  23. except:
  24. print('init error!!!')
  25. def getOffset(self,index=0):
  26. try:
  27. params = {
  28. 'offset':str(20*index),
  29. 'format':'json',
  30. 'keyword':'cosplay',
  31. 'autoload':'true',
  32. 'count':'',
  33. 'cur_tab':'',
  34. 'from':'gallery',
  35. }
  36. httpaddr = 'https://www.toutiao.com/search_content/?'+urlencode(params)
  37. req = self.m_session.get(httpaddr,headers=self.m_headers, cookies=self.m_cookiejar, timeout=5)
  38. if req.status_code != 200:
  39. return None
  40. res = req.json()
  41. if('data' not in res.keys()):
  42. return None
  43. for item in res.get('data'):
  44. if('title' not in item.keys()):
  45. continue
  46. if('image_list' not in item.keys()):
  47. continue
  48. titlenamelist=item['title'].split('/')
  49. titlename = titlenamelist[-1]
  50. savedir=os.path.join(self.dirpath,titlename)
  51. print('正在抓取'+titlename+'.........')
  52. if(os.path.exists(savedir) == False):
  53. os.makedirs(savedir)
  54. imagelist = item.get('image_list')
  55. for imag in imagelist:
  56. if 'url' not in imag.keys():
  57. continue
  58. #print(imag['url'])
  59. image1,image2=imag['url'].split('list')
  60. image3=imag['url'].split('/')[-1]
  61. imagepath=os.path.join(savedir,image3+'.jpg')
  62. if(os.path.exists(imagepath)):
  63. continue
  64. imageaddr = 'http:'+image1+'large'+image2
  65. imagedata=self.m_session.get(imageaddr,timeout=5)
  66. with open (imagepath,'wb')as f:
  67. f.write(imagedata.content)
  68. print('抓取'+titlename+'成功!!!.........')
  69. time.sleep(1)
  70. return req.json()
  71. except:
  72. print('get over view error')
  73. return None
  74.  
  75. if __name__ == "__main__":
  76. try:
  77. asscrapy = AjaxScrapy()
  78. for i in range(0,5):
  79. res = asscrapy.getOffset(i)
  80. if(res == None):
  81. continue
  82. #print(type(res))
  83.  
  84. except:
  85. print('scrapy exception!')
  86. pass

更多源码下载
https://github.com/secondtonone1/python-/tree/master/pythoncookie
个人博客
https://www.limerence2017.com
谢谢关注我的公总号:

python学习(26)分析ajax请求抓取今日头条cosplay小姐姐图片的更多相关文章

  1. 分析ajax请求抓取今日头条关键字美图

    # 目标:抓取今日头条关键字美图 # 思路: # 一.分析目标站点 # 二.构造ajax请求,用requests请求到索引页的内容,正则+BeautifulSoup得到索引url # 三.对索引url ...

  2. 爬虫(八):分析Ajax请求抓取今日头条街拍美图

    (1):分析网页 分析ajax的请求网址,和需要的参数.通过不断向下拉动滚动条,发现请求的参数中offset一直在变化,所以每次请求通过offset来控制新的ajax请求. (2)上代码 a.通过aj ...

  3. Python爬虫学习==>第十一章:分析Ajax请求-抓取今日头条信息

    学习目的: 解决AJAX请求的爬虫,网页解析库的学习,MongoDB的简单应用 正式步骤 Step1:流程分析 抓取单页内容:利用requests请求目标站点,得到单个页面的html代码,返回结果: ...

  4. 通过分析Ajax请求 抓取今日头条街拍图集

    代码: import os import re import json import time from hashlib import md5 from multiprocessing import ...

  5. python爬虫之分析Ajax请求抓取抓取今日头条街拍美图(七)

    python爬虫之分析Ajax请求抓取抓取今日头条街拍美图 一.分析网站 1.进入浏览器,搜索今日头条,在搜索栏搜索街拍,然后选择图集这一栏. 2.按F12打开开发者工具,刷新网页,这时网页回弹到综合 ...

  6. python3爬虫-分析Ajax,抓取今日头条街拍美图

    # coding=utf-8 from urllib.parse import urlencode import requests from requests.exceptions import Re ...

  7. python爬虫---实现项目(二) 分析Ajax请求抓取数据

    这次我们来继续深入爬虫数据,有些网页通过请求的html代码不能直接拿到数据,我们所需的数据是通过ajax渲染到页面上去的,这次我们来看看如何分析ajax 我们这次所使用的网络库还是上一节的Reques ...

  8. 分析Ajax来爬取今日头条街拍美图并保存到MongDB

    前提:.需要安装MongDB 注:因今日投票网页发生变更,如下代码不保证能正常使用 #!/usr/bin/env python #-*- coding: utf-8 -*- import json i ...

  9. 15-分析Ajax请求并抓取今日头条街拍美图

    流程框架: 抓取索引页内容:利用requests请求目标站点,得到索引网页HTML代码,返回结果. 抓取详情页内容:解析返回结果,得到详情页的链接,并进一步抓取详情页的信息. 下载图片与保存数据库:将 ...

随机推荐

  1. arm学习——有关位操作的总结

    在学习arm的过程中,感觉寄存器,基本不会提供位操作,而是整体的操作, 整体操作的就是要注意在对某位赋值的时候不要影响到其他位,看上去不简单, 其实,整体操作有技巧, 那么就来总结一下: 1.首先要理 ...

  2. Mybatis使用generator自动生成的Example类使用OR条件查询

    参考:https://blog.csdn.net/qq_36614559/article/details/80354511 public List<AssetsDevicetypeRefacto ...

  3. [BZOJ4379][POI2015]Modernizacja autostrady[树的直径+换根dp]

    题意 给定一棵 \(n\) 个节点的树,可以断掉一条边再连接任意两个点,询问新构成的树的直径的最小和最大值. \(n\leq 5\times 10^5\) . 分析 记断掉一条边之后两棵树的直径为 \ ...

  4. 您需要来自XXX的权限才能对此文件夹进行更改

    解决办法: cmd命令:del/f/s/q 文件夹

  5. R绘图 第六篇:绘制线图(ggplot2)

    线图是由折线构成的图形,线图是把散点从左向右用直线连接起来而构成的图形,在以时间序列为x轴的线图中,可以看到数据增长的趋势. geom_line(mapping = NULL, data = NULL ...

  6. stl源码剖析 详细学习笔记 空间配置器

    //---------------------------15/04/05---------------------------- /* 空间配置器概述: 1:new操作包含两个阶段操作 1>调 ...

  7. 177. Convert Sorted Array to Binary Search Tree With Minimal Height【LintCode by java】

    Description Given a sorted (increasing order) array, Convert it to create a binary tree with minimal ...

  8. 复习下VLAN的知识

    转载:来自百度百科 VLAN一般指虚拟局域网 VLAN(Virtual Local Area Network)的中文名为"虚拟局域网". 虚拟局域网(VLAN)是一组逻辑上的设备和 ...

  9. SQL Server中事务日志管理的步骤,第5级:完全恢复模式管理日志(译)

    SQL Server中事务日志管理的步骤,第5级:完全恢复模式管理日志 作者:Tony Davis,2012/01/27 系列 本文是进阶系列的一部分:SQL Server中事务日志管理的步骤 当事情 ...

  10. Linux内核分析第四周总结

    用户态,内核态和中断处理过程 库函数将系统调用封装起来 用户态和内核态的差别: 在内核态时,cs和eip的值可以是任意地址,但在用户态时只能访问0x00000000 - 0xbfffffff,0x00 ...