Python爬取动态网页中图片的完整实例

动态网页爬取是爬虫学习中的一个难点。本文将以知名插画网站pixiv为例,简要介绍动态网页爬取的方法。

写在前面

本代码的功能是输入画师的pixiv id,下载画师的所有插画。由于本人水平所限,所以代码不能实现自动登录pixiv,需要在运行时手动输入网站的cookie值。

重点:请求头的构造,json文件网址的查找,json中信息的提取

分析

创建文件夹

根据画师的id创建文件夹(相关路径需要自行调整)。

def makefolder(id): # 根据画师的id创建对应的文件夹
	try:
		folder = os.path.join('E:\pixivimages', id)
		os.mkdir(folder)
		return folder
	except(FileExistsError):
		print('the folder exists!')
		exit()

获取作者所有图片的id

访问url:https://pixiv.net/ajax/user/画师id/profile/all(这个json可以在画师主页url:https://www.pixiv.net/users/画师id 的开发者面板中找到,如图:)

json内容:

将json文档转化为python的字典,提取对应元素即可获取所有的插画id。

def getAuthorAllPicID(id, cookie): # 获取画师所有图片的id
	url = 'https://pixiv.net/ajax/user/' + id + '/profile/all' # 访问存有画师所有作品
	headers = {
		'User-Agent': user_agent,
		'Cookie': cookie,
		'Referer': 'https://www.pixiv.net/artworks/'
		# referer不能缺少,否则会403
	}
	res = requests.get(url, headers=headers, proxies=proxies)
	if res.status_code == 200:
		resdict = json.loads(res.content)['body']['illusts'] # 将json转化为python的字典后提取元素
		return [key for key in resdict] # 返回所有图片id
	else:
		print("Can not get the author's picture ids!")
		exit()

获取图片的真实url并下载

访问url:https://www.pixiv.net/ajax/illust/图片id?lang=zh,可以看到储存有图片真实地址的json:(这个json可以在图片url:https://www.pixiv.net/artworks/图片id 的开发者面板中找到)

用同样的方法提取json中有用的元素:

def getPictures(folder, IDlist, cookie): # 访问图片储存的真实网址
	for picid in IDlist:
		url1 = 'https://www.pixiv.net/artworks/{}'.format(picid) # 注意这里referer必不可少,否则会报403
		headers = {
			'User-Agent': user_agent,
			'Cookie': cookie,
			'Referer': url1
		}
		url = 'https://www.pixiv.net/ajax/illust/' + str(picid) + '?lang = zh' #访问储存图片网址的json
		res = requests.get(url, headers=headers, proxies=proxies)
		if res.status_code == 200:
			data = json.loads(res.content)
			picurl = data['body']['urls']['original'] # 在字典中找到储存图片的路径与标题
			title = data['body']['title']
			title = changeTitle(title) # 调整标题
			print(title)
			print(picurl)
			download(folder, picurl, title, headers)
		else:
			print("Can not get the urls of the pictures!")
			exit()

def changeTitle(title): # 为了防止
	global i
	title = re.sub('[*:]', "", title) # 如果图片中有下列符号,可能会导致图片无法成功下载
	# 注意可能还会有许多不能用于文件命名的符号,如果找到对应符号要将其添加到正则表达式中
	if title == '無題': # pixiv中有许多名为'無題'(日文)的图片,需要对它们加以区分以防止覆盖
		title = title + str(i)
		i = i + 1
	return title

def download(folder, picurl, title, headers): # 将图片下载到文件夹中
	img = requests.get(picurl, headers=headers, proxies=proxies)
	if img.status_code == 200:
		with open(folder + '\\' + title + '.jpg', 'wb') as file: # 保存图片
			print("downloading:" + title)
			file.write(img.content)
	else:
		print("download pictures error!")

完整代码

import requests
from fake_useragent import UserAgent
import json
import re
import os

global i
i = 0
ua = UserAgent() # 生成假的浏览器请求头,防止被封ip
user_agent = ua.random # 随机选择一个浏览器
proxies = {'http': 'http://127.0.0.1:51837', 'https': 'http://127.0.0.1:51837'} # 代理,根据自己实际情况调整,注意在请求时一定不要忘记代理!!

def makefolder(id): # 根据画师的id创建对应的文件夹
	try:
		folder = os.path.join('E:\pixivimages', id)
		os.mkdir(folder)
		return folder
	except(FileExistsError):
		print('the folder exists!')
		exit()

def getAuthorAllPicID(id, cookie): # 获取画师所有图片的id
	url = 'https://pixiv.net/ajax/user/' + id + '/profile/all' # 访问存有画师所有作品
	headers = {
		'User-Agent': user_agent,
		'Cookie': cookie,
		'Referer': 'https://www.pixiv.net/artworks/'
	}
	res = requests.get(url, headers=headers, proxies=proxies)
	if res.status_code == 200:
		resdict = json.loads(res.content)['body']['illusts'] # 将json转化为python的字典后提取元素
		return [key for key in resdict] # 返回所有图片id
	else:
		print("Can not get the author's picture ids!")
		exit()

def getPictures(folder, IDlist, cookie): # 访问图片储存的真实网址
	for picid in IDlist:
		url1 = 'https://www.pixiv.net/artworks/{}'.format(picid) # 注意这里referer必不可少,否则会报403
		headers = {
			'User-Agent': user_agent,
			'Cookie': cookie,
			'Referer': url1
		}
		url = 'https://www.pixiv.net/ajax/illust/' + str(picid) + '?lang = zh' #访问储存图片网址的json
		res = requests.get(url, headers=headers, proxies=proxies)
		if res.status_code == 200:
			data = json.loads(res.content)
			picurl = data['body']['urls']['original'] # 在字典中找到储存图片的路径与标题
			title = data['body']['title']
			title = changeTitle(title) # 调整标题
			print(title)
			print(picurl)
			download(folder, picurl, title, headers)
		else:
			print("Can not get the urls of the pictures!")
			exit()

def changeTitle(title): # 为了防止
	global i
	title = re.sub('[*:]', "", title) # 如果图片中有下列符号,可能会导致图片无法成功下载
	# 注意可能还会有许多不能用于文件命名的符号,如果找到对应符号要将其添加到正则表达式中
	if title == '無題': # pixiv中有许多名为'無題'(日文)的图片,需要对它们加以区分以防止覆盖
		title = title + str(i)
		i = i + 1
	return title

def download(folder, picurl, title, headers): # 将图片下载到文件夹中
	img = requests.get(picurl, headers=headers, proxies=proxies)
	if img.status_code == 200:
		with open(folder + '\\' + title + '.jpg', 'wb') as file: # 保存图片
			print("downloading:" + title)
			file.write(img.content)
	else:
		print("download pictures error!")

def main():
	global i
	id = input('input the id of the artist:')
	cookie = input('input your cookie:') # 半自动爬虫,需要自己事先登录pixiv以获取cookie
	folder = makefolder(id)
	IDlist = getAuthorAllPicID(id, cookie)
	getPictures(folder, IDlist, cookie)

if __name__ == '__main__':
	main()

效果

总结

到此这篇关于Python爬取动态网页中图片的文章就介绍到这了,更多相关Python爬取动态网页图片内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 使用Python的Scrapy框架十分钟爬取美女图

    简介 scrapy 是一个 python 下面功能丰富.使用快捷方便的爬虫框架.用 scrapy 可以快速的开发一个简单的爬虫,官方给出的一个简单例子足以证明其强大: 快速开发 下面开始10分钟倒计时: 当然开始前,可以先看看之前我们写过的 scrapy 入门文章 <零基础写python爬虫之使用Scrapy框架编写爬虫 1. 初始化项目 scrapy startproject mzt cd mzt scrapy genspider meizitu meizitu.com 2. 添加 spide

  • 只用50行Python代码爬取网络美女高清图片

    一.技术路线 requests:网页请求 BeautifulSoup:解析html网页 re:正则表达式,提取html网页信息 os:保存文件 import re import requests import os from bs4 import BeautifulSoup 二.获取网页信息 常规操作,获取网页信息的固定格式,返回的字符串格式的网页内容,其中headers参数可模拟人为的操作,'欺骗'网站不被发现 def getHtml(url): #固定格式,获取html内容 headers

  • Python爬虫之教你利用Scrapy爬取图片

    Scrapy下载图片项目介绍 Scrapy是一个适用爬取网站数据.提取结构性数据的应用程序框架,它可以通过定制化的修改来满足不同的爬虫需求. 使用Scrapy下载图片 项目创建 首先在终端创建项目 # win4000为项目名 $ scrapy startproject win4000 该命令将创建下述项目目录. 项目预览 查看项目目录 win4000 win4000 spiders __init__.py __init__.py items.py middlewares.py pipelines

  • python小技巧之批量抓取美女图片

    其中用到urllib2模块和正则表达式模块.下面直接上代码: [/code]#!/usr/bin/env python#-*- coding: utf-8 -*-#通过urllib(2)模块下载网络内容import urllib,urllib2,gevent#引入正则表达式模块,时间模块import re,timefrom gevent import monkey monkey.patch_all() def geturllist(url):    url_list=[]    print ur

  • Python使用xpath实现图片爬取

    高性能异步爬虫 目的:在爬虫中使用异步实现高性能的数据爬取操作 异步爬虫的方式: - 多线程.多进程(不建议): 好处:可以为相关阻塞的操作单独开启多线程或进程,阻塞操作就可以异步执行; 弊端:无法无限制的开启多线程或多进程. - 线程池.进程池(适当的使用): 好处:我们可以降低系统对进程或线程创建和销毁的一个频率,从而很好的降低系统的开销: 弊端:池中线程或进程的数据是有上限的. 代码如下 # _*_ coding:utf-8 _*_ """ @FileName :6.4

  • python实现爬虫下载美女图片

    本次爬取的贴吧是百度的美女吧,给广大男同胞们一些激励 在爬取之前需要在浏览器先登录百度贴吧的帐号,各位也可以在代码中使用post提交或者加入cookie 爬行地址:http://tieba.baidu.com/f?kw=%E7%BE%8E%E5%A5%B3&ie=utf-8&pn=0 #-*- coding:utf-8 -*- import urllib2 import re import requests from lxml import etree 这些是要导入的库,代码并没有使用正则

  • python爬虫入门教程之点点美女图片爬虫代码分享

    继续鼓捣爬虫,今天贴出一个代码,爬取点点网「美女」标签下的图片,原图. # -*- coding: utf-8 -*- #--------------------------------------- # 程序:点点美女图片爬虫 # 版本:0.2 # 作者:zippera # 日期:2013-07-26 # 语言:Python 2.7 # 说明:能设置下载的页数 #--------------------------------------- import urllib2 import urll

  • Python使用爬虫抓取美女图片并保存到本地的方法【测试可用】

    本文实例讲述了Python使用爬虫抓取美女图片并保存到本地的方法.分享给大家供大家参考,具体如下: 图片资源来自于www.qiubaichengren.com 代码基于Python 3.5.2 友情提醒:血气方刚的骚年.请 谨慎阅图! 谨慎阅图!! 谨慎阅图!!! code: #!/usr/bin/env python # -*- coding: utf-8 -*- import os import urllib import urllib.request import re from urll

  • python制作微博图片爬取工具

    有小半个月没有发博客了,因为一直在研究python的GUI,买了一本书学习了一些基础,用我所学做了我的第一款GUI--微博图片爬取工具.本软件源代码已经放在了博客中,另外软件已经打包好上传到网盘中以供下载学习. 一.准备工作 本次要用到以下依赖库:re json os random tkinter threading requests PIL 其中后两个需要安装后使用 二.预览 1.启动 2.运行中 3.结果 这里只将拿一张图片作为展示. 三.设计流程 设计流程分为总体设计和详细设计,这里我会使

  • Python制作爬虫抓取美女图

    作为一个新世纪有思想有文化有道德时刻准备着的屌丝男青年,在现在这样一个社会中,心疼我大慢播抵制大百度的前提下,没事儿上上网逛逛YY看看斗鱼翻翻美女图片那是必不可少的,可是美图虽多翻页费劲!今天我们就搞个爬虫把美图都给扒下来!本次实例有2个:煎蛋上的妹子图,某网站的rosi图.我只是一个学习python的菜鸟,技术不可耻,技术是无罪的!!! 煎蛋: 先说说程序的流程:获取煎蛋妹子图URL,得到网页代码,提取妹子图片地址,访问图片地址并将图片保存到本地.Ready? 先让我们看看煎蛋妹子网页: 我们

随机推荐