'''
思路
一: 由于是Ajax的网页,需要先往下划几下看看XHR的内容变化
二:分析js中的代码内容
三:获取一页中的内容
四:获取图片
五:保存在本地 使用的库1. requests 网页获取库
2.from urllib.parse import urlencode 将字典转化为字符串内容整理拼接到url
3.os 操作文件的库
4.from hashlib import md5 md5 的哈希库
5.from multiprocessing.pool import Pool 多线程库
'''
import requests
from urllib.parse import urlencode
from requests import codes
import os
from hashlib import md5
from multiprocessing.pool import Pool # 首先是获取一页的内容,观察XHR可得知 加载图片是改变offset的值,观察XHR内容得知url和字典内容拼接的字符串为目标网页,判断网页是否响应,如果响应则返回json格式文件,如果不响应则
# 抛出
def get_page(offset):
params = {'offset': offset,
'format': 'json',
'keyword': '街拍',
'autoload': 'true',
'count': '',
'cur_tab': '',
'from': 'search_tab' }
base_url = 'https://www.toutiao.com/search_content/?' # 基础网页的基础网址
url = base_url + urlencode(params) # 拼接网址
try:
resp = requests.get(url)
if resp.status_code == 200:
return resp.json()
except:
return None # 第二步,已经获取网页的url,接下来获取想要的内容,已经知道需求是获取妹子图片,通过传入json ,进一步实现获取内
# 容,调取json的方法get(),传入键名字,获取内容
def get_img(json):
if json.get('data'): # data是原网页的一个数据集合
data = json.get('data')
for item in data: # 遍历data的内容,
if item.get('cell_type') is not None:
continue
title = item.get('title')
images = item.get('image_list')
for image in images:
yield {
'image': 'https:' + image.get('url'),
'title': title
} # 第三步,保存内容到本地,传入的内容是,获取图片中的item,引入os库用于文件夹操作
def save_files(item):
img_path = 'img' + os.path.sep +item.get('title')
if not os.path.exists(img_path): # 判断文件夹是否存在,如果存在继续,不存在创建继续
os.makedirs(img_path)
try:
resq = requests.get(item.get('image'))
if resq.status_code == 200:
file_path = img_path + os.path.sep + '{file_name}.{file_suf}'.format(
file_name=md5(resq.content).hexdigest(), # 把获取的内容md5处理获得内容
file_suf='jpg'
)
if not os.path.exists(file_path):
with open(file_path, 'wb') as f:
f.write(resq.content)
print('Downloaded image path is' + file_path)
else:
print('Already Downloaded', file_path) except requests.ConnectionError:
print('Failed to Save Image,item %s' % item)
#第四步 创建运行主函数 main 方法 ,通过offset 数据改变获取内容
def main (offset):
json = get_page(offset)
for item in get_img(json):
save_files(item) GROUP_START = 0
GROUP_END = 7
#最后调用多线程 进行下载
if __name__ == '__main__':
pool = Pool()
groups = ([x * 20 for x in range(GROUP_START, GROUP_END + 1)])
pool.map(main, groups)
pool.close()
pool.join()

Ajax 针对类似微博,今日头条那种需要下拉,内容放在js里的网页

最新文章

  1. ruby -- 进阶学习(十五)friendly_id配置
  2. OpenCV CommandLineParser 的用法
  3. java中用线程解决进出水问题
  4. WCF 项目应用连载[3] - 双向通信 实例管理与服务端监控
  5. Shell中IFS用法
  6. (转)SQL Server 2008怎样编辑200行以上的数据
  7. GridView Footer页脚统计实现多行
  8. Android API在不同版本系统上的兼容性
  9. 非常简洁的js图片轮播
  10. HDU 5480 Conturbatio
  11. 【批处理学习笔记】第十三课:常用dos命令(3)
  12. Ios App上传步骤
  13. Hibernate-ORM:05.Hibernate中的list()和iterator()
  14. ListView刷新某一项Item
  15. Api 文档管理系统 RAP2 环境搭建
  16. js this的含义以及讲解
  17. 【转载】论文笔记系列-Tree-CNN: A Deep Convolutional Neural Network for Lifelong Learning
  18. js 日期排序(sort)
  19. Spring MVC数据绑定
  20. 【mysql】排序方法

热门文章

  1. Visual Studio 2013 osg
  2. svn版本分支及冲突解决笔记
  3. Golang 字符编码
  4. 回答了这四个问题,你就可以打造最佳App首页
  5. UCI数据
  6. Git简明使用指南[转]
  7. (转)【经验之谈】Git使用之TortoiseGit配置VS详解
  8. C++11新标准学习
  9. UVALive - 6434 —(思维题)
  10. eclipse mac