Python爬虫学习笔记之爬今日头条的街拍图片

news/2024/7/19 10:47:49 标签: 爬虫, python, json

代码:

 

 1 import requests
 2 import os
 3 from hashlib import md5
 4 from urllib.parse import urlencode
 5 from multiprocessing.pool import Pool
 6 
 7 GROUP_START = 1
 8 GROUP_END = 5
 9 
10 def get_page(offset):
11     params = {
12         'offset': offset,
13         'format': 'json',
14         'keyword': '街拍',
15         'autoload': 'true',
16         'count': '20',
17         'cur_tab': '3',
18         'form': 'search_tab',
19     }
20     url  = 'https://www.toutiao.com/search_content/?' + urlencode(params)
21     try:
22         response = requests.get(url)
23         if response.status_code == 200:
24             return response.json()
25     except requests.ConnectionError:
26         return None
27 
28 def get_images(json):
29     data = json.get('data')
30     if data:
31         for item in data:
32             image_list = item.get('image_list')
33             title = item.get('title')
34             if image_list:
35                 for image in image_list:
36                     # 构造一个生成器,将图片和标题一起返回
37                     yield {
38                         'image': image.get('url'),
39                         'title': title
40                     }
41 
42 # item就是get_image()返回的一个字典
43 # item里面的title创建一个文件夹
44 def save_image(item):
45     if not os.path.exists(item.get('title')):
46         os.mkdir(item.get('title'))
47     try:
48         local_image_url = item.get('image')
49         new_image_url = local_image_url.replace('list', 'large')
50         response = requests.get('http:' + new_image_url)
51         if response.status_code == 200:
52             file_path = '{0}/{1}.{2}'.format(item.get('title'), md5(response.content).hexdigest(), 'jpg')
53             # 判断路径是否存在,如果不存在,写入
54             if not os.path.exists(file_path):
55                 with open(file_path, 'wb')as f:
56                     f.write(response.content)
57             else:
58                 print('Already Download', file_path)
59     except:
60         print('Failed to save image')
61 
62 # 定义一个offset数组,遍历,提取图片,下载
63 def main(offset):
64     json = get_page(offset)
65     for item in get_images(json):
66         print(item)
67         save_image(item)
68 
69 if __name__ == '__main__':
70     pool = Pool() # 创建进程池
71     groups = ([x * 20 for x in range(GROUP_START, GROUP_END + 1)])
72     pool.map(main, groups) # 第一个参数是函数,第二个参数是一个迭代器,将迭代器中的数字作为参数依次传入函数中
73     pool.close() # 关闭pool,使其不在接受新的(主进程)任务
74     pool.join() # 主进程阻塞后,让子进程继续运行完成,子进程运行完后,再把主进程全部关掉

 

 

结果:

 

此时可以看到文件夹里:

 

随便打开一个:

 

Successful!

 

转载于:https://www.cnblogs.com/Trojan00/p/9488453.html


http://www.niftyadmin.cn/n/837177.html

相关文章

.NET中DataList嵌套说明

.NET中DataList嵌套说明 有时在我们进行数据绑定时,是可能需要进行嵌套绑定的,以显示主从关系的数据。即,一个DataList中嵌套一个子DataList,而子DataList的数据则是随主DataList的数据进行变化的。 1、我们先在页面中布置好两个DataList。并分别起名,dlsProductMenu,dl…

ftp常见问题解答

FTP有哪些功能? FTP(File Transfer Protocol)是 Internet 上用来传送文件的协议(文件传输协议)。它是为了我们能够在 Internet 上互相传送文件而制定的的文件传送标准,规定了 Internet 上文件如何传送。也就是说,通过 FTP 协议,我们就可以跟 Internet 上的 FTP 服务器…

关于python文件的+打开模式、哪个选项的描述是正确的_关于Python文件的 '+' 打开模式,以下选项中描述正确的是____。???????????????????????????????...

关于Python文件的 打开模式,以下选项中描述正确的是____。???????????????????????????????答:与r/w/a/x一同使用,在原功能基础上增加同时读写功能智慧职教: 饱和粉土围岩级别是答:Ⅵ3岁之前的儿童喜欢练习性…

electron跳坑指南 1(electron的安装)

前言: 对于electron的介绍大家可以自己百度,这个使用写客户端软件很爽,写下心得以便于大家学习和使用! 我本地开发环境为:Mac OS目录在 :/Volumes/lee/electron/开发工具:phpstorm 第一章介绍electron的安装: 对于electron 的安装方式有很多 第1种方式: 非常的简单 就是使用npm…

easyui-tree的json字符串结构(1层、2层、3层、4层)

easyui-tree的json字符串结构(1层、2层、3层、4层) 1层结构json: public string ParentTreeJson(){JobQuery jobQuery new JobQuery() { PageIndex 1, PageSize int.MaxValue };var parent GetJobs(jobQuery);if (parent ! null &&…

SOA与ERP如何融合?大脑结构之于信息系统设计

左脑类应用是企业一致性管理的基础 大脑的分工如图一所示,左脑是负责逻辑,数字,书面语言,分析,右脑是负责直觉,综合,图形。如果把企业信息系统做一个类比的话,(参考图二),可以粗略的按应用的特点分成两类,象ERP这类应用系统采用的是左脑的方式,强调准确,逻辑化,…

简单示例发布webservice并且生成客户端去调用

这两天在网上看了一些关于webservice的教程,自己也做了一个demo,在此做个记录。 webservice简介:是一个远程调用技术 通过SOAP在Web上提供服务,使用WSDL文件进行说明,并通过UDDI进行注册。XML:(Extensible …

微信小程序 mysql await mysql_在微信小程序中使用 async/await

微信小程序中有大量接口是异步调用,比如 wx.login()、wx.request()、wx.getUserInfo() 等,都是使用一个对象作为参数,并定义了 success()、fail() 和 complete() 作为异步调用不同情况下的回调。但是,以回调的方式来写程序&#x…