学习Ajax异步加载:爬今日头条

【项目介绍】
现在很多网址都是异步加载的,一般我们浏览一个页面返回的是网页的框架,而内容是用渲染的,一般是我们一边拖动内容网页会一边发出异步加载的请求并响应部分内容,这样子我们打开网页时响应速度会快很多,也能减小服务器的压力,使服务器支持更多的并发 。但是也因为异步加载的关系,用以往直接请求网页内容的方式是找不到要爬的内容的,这个项目尝试分析今日头条的异步加载方式 , 爬取头条上的图片 。
【项目工具】
+(主要用于获?。?
【项目流程】
1.分析今日头条加载方式:搜索街拍对应页面的url发现的是网页的框架,没有返回街拍内容 。
切换到XHR,可以看到选中内容返回json数据,里面有街拍的详细内容,并且往下滑动街拍内容 , 可以看到XHR里有多个相似URL加载出来 , 对比他们的URL发现主要是不同,一般指偏移量 。
如图,可以判断该URL的param比较好构造,除了其他都是固定的,另外是时间戳 , 可以不加 。
2.发现如果直接爬对应URL,获取到的json数据里data为空,通过网上查找发现需要附带 , 另外可以发现直接跳转“=街拍”的URL会跳出验证,而从今日头条首页搜索“=街拍”再搜索访问页面就不会出现验证,故判断先找到请求头的才能实现后续访问 。
!注意是请求头的 , 可以用去(),也可以直接打开网页复制,之前好几次用了另外获取的方法 , 得到的都是响应头的 , 这里存在困惑 。
3.找图片 。我们发现今日头条街拍的文章分为两种,一种是点击进去图片已经排列好,另一种是类似相册的方式,需要左右点击跳转下一站图片,这两种对应的图片爬取方式是不一样的 。
具体分析两种:
这种是图片集的(需要左右点击切换照片) , 这种如果在json的里是得不到全部图片的,需要访问该文章的链接,在链接里的html里找 。
另一种则可以直接在里找:

学习Ajax异步加载:爬今日头条

文章插图
4.爬取图片
5.存放图片
附完整代码:
import requests,re,osfrom hashlib import md5from selenium import webdriverdef get_cookies(url):str=''options = webdriver.ChromeOptions()options.add_argument('--headless')browser = webdriver.Chrome(options=options)browser.get(url)for i in browser.get_cookies():try:name=i.get('name')value=http://www.kingceram.com/post/i.get('value')str=str+name+'='+value+';'except ValueError as e:print(e)return strdef get_page(offset):params = {'aid': '24','app_name': 'web_search','offset': offset,'format': 'json','keyword': '街拍','autoload': 'true','count': '20','en_qc': '1','cur_tab': '1','from': 'search_tab','pd': 'synthesis',}url='https://www.toutiao.com/api/search/content/'try:r=requests.get(url,params=params,headers=headers)if r.status_code==200:print(r.content)return r.json()else:print('requests get_page error!')except requests.ConnectionError:return Nonedef get_images(json):remove_chars = '[’!"#$%&\'()*+,-./:;<=>?@,。?