前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >今日头条街拍图片抓取

今日头条街拍图片抓取

作者头像
松鼠先生
发布2022-02-22 14:48:56
4210
发布2022-02-22 14:48:56
举报

爬取目标:

今日头条右上角输入:街拍

之后得到的是这样一个磨人的小妖精

分析网页之后发现是Ajax技术(我用的是Chrom的开发者工具,点XHR之后发现了常规的Ajax请求)

然后在细致的分析Preview里面的代码。会发现image_list里面包含了图片的链接,title里面包含了名称。这就是我们需要爬取的部分了如图

然后回到Headers,我们根据Request URL来构造GET请求。如下图

其中唯一的变化参数是offset,将其作为参数。来构造单个的Ajax请求。。代码如下:

代码语言:javascript
复制
def get_page(offset):
 params = {
 'offset': offset,
 'format': 'json',
 'keyword': '街拍',
 'autoload': 'true',
 'count': '20',
 'cur_tab': '1',
 'from': 'search_tab',
 }
 url = 'https://www.toutiao.com/search_content/?' + urlencode(params)
 try:
 response = requests.get(url)
 if response.status_code == 200:
 return response.json()
 except requests.ConnectError:

 return None

然后提取每一张图片的链接和名字,代码如下:

代码语言:javascript
复制
def get_images(json):
 data = json.get('data')
 if data:
 for item in data:
 title = item.get('title')
 image_list = item.get('image_list')
 if image_list:
 for image in image_list:
 yield {
 'image': image.get('url'),
 'title': title
 }

在接下来就是保存了。崔大佬用的是名字来当做新建文件夹的名称,每一张图片的名字是其内容的MD5值,这样可以去除重复,代码如下:

代码语言:javascript
复制
def save_image(item):
 if not os.path.exists(item.get('title')):
 os.mkdir(item.get('title'))
 try:
 local_image_url = item.get('image')
 new_image_url = local_image_url.replace('list','large')
 response = requests.get('http:'+ new_image_url)
 if response.status_code == 200:
 file_path = '{0}/{1}.{2}'.format(item.get('title'), md5(response.content).hexdigest(), 'jpg')
 if not os.path.exists(file_path):
 with open(file_path, 'wb') as f:#
 f.write(response.content)
 else:
 print('Already Downloaded', file_path)
 except requests.ConnectionError:

 print('Failed to Save Image')

最后运行结果如下:

我感觉崔大佬代码很简练,学习他的还是需要一些python 的基础知识。重点应该学习一下他的编程思想。

不过觉得这个程序应该是用多进程下的图片,书上的原话是多线程。。。(采用与廖雪峰的对比)

也不知道是不是。不过大佬的书值得学习。也正在学习。目前市面上爬虫最好的一本了。附上最终完整代码:

代码语言:javascript
复制
import os
import requests
from urllib.parse import urlencode
from hashlib import md5
from multiprocessing.pool import Pool


GROUP_START = 0
GROUP_END = 2




def get_page(offset):
 params = {
 'offset': offset,
 'format': 'json',
 'keyword': '街拍',
 'autoload': 'true',
 'count': '20',
 'cur_tab': '1',
 'from': 'search_tab',
 }
 url = 'https://www.toutiao.com/search_content/?' + urlencode(params)
 try:
 response = requests.get(url)
 if response.status_code == 200:
 return response.json()
 except requests.ConnectError:
 return None


 
def get_images(json):
 data = json.get('data')
 if data:
 for item in data:
 title = item.get('title')
 image_list = item.get('image_list')
 if image_list:
 for image in image_list:
 yield {
 'image': image.get('url'),
 'title': title
 }


 
 
 
def save_image(item):
 if not os.path.exists(item.get('title')):
 os.mkdir(item.get('title'))
 try:
 local_image_url = item.get('image')
 new_image_url = local_image_url.replace('list','large')
 response = requests.get('http:'+ new_image_url)
 if response.status_code == 200:
 file_path = '{0}/{1}.{2}'.format(item.get('title'), md5(response.content).hexdigest(), 'jpg')
 if not os.path.exists(file_path):
 with open(file_path, 'wb') as f:#
 f.write(response.content)
 else:
 print('Already Downloaded', file_path)
 except requests.ConnectionError:
 print('Failed to Save Image')
 
def main(offset):
 json = get_page(offset)
 for item in get_images(json):
 print(item)
 save_image(item)#
 


 
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()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CLI 工具
云开发 CLI 工具(Cloudbase CLI Devtools,CCLID)是云开发官方指定的 CLI 工具,可以帮助开发者快速构建 Serverless 应用。CLI 工具提供能力包括文件储存的管理、云函数的部署、模板项目的创建、HTTP Service、静态网站托管等,您可以专注于编码,无需在平台中切换各类配置。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档