适用的图片网站:美桌

源代码:

import requests
import re
import urllib
from bs4 import BeautifulSoup def get_html_text(url):
'''
获取网址url的HTML代码,以字符串形式返回html代码 '''
try:
res = requests.get(url, timeout = 6)
res.raise_for_status()
res.encoding = res.apparent_encoding
return res.text
except:
return ''
print('请求异常') def get_grupic_url(page_url, grupic_url_list, key_url, key_word):
'''
获取每张页面中每个图册的url链接,每个图册的url都有共同
且有别于其他链接的url,我们把部分特征的字符串放在key_url
中,通过它我们就可以筛选出页面中所有图册的url '''
page_html = get_html_text(page_url)
#解析页面的html代码
soup = BeautifulSoup(page_html, 'html.parser')
#获取该页面html代码中的所有<a>标签
a_tags = soup.find_all('a', attrs = {'href':True}) select_atag(grupic_url_list, a_tags, key_url, key_word) def get_allpages_url(cover_url, pages_url_list):
'''通过递归获取所有页面的链接,
直到该页面不存在class = 'next'的<a>标签 '''
html = get_html_text(cover_url)
soup = BeautifulSoup(html, 'html.parser')
#找到属性class = 'next'的<a>标签
a_tags = soup.find_all('a', class_ = 'next')
#如果<a>标签存在,就将该标签的url加入列表
if a_tags:
nextpage_url = a_tags[0].get('href')
pages_url_list.append(nextpage_url)
#递归获取下一个页面的<a>标签
get_allpages_url(nextpage_url, pages_url_list)
#当不存在属性class = 'next'的<a>标签时,说明这是最后一页,结束递归
return None def download_each_page(grupic_url_list, file_path1, page):
'''
通过调用download_each_group()函数,
下载每一页中的所有组图 '''
print('\n\n第 {0} 页开始下载:\n'.format(str(page))) gup = 1 #组数标记
#下载该页面中每个小相册的所有图片
for grupic_url in grupic_url_list:
file_path2 = file_path1 + '_{0}'.format(str(gup))
#获取该页面的h1标题
h1_string = get_h1_string(grupic_url)
try:
download_each_group(grupic_url, file_path2, h1_string, gup)
gup += 1
except:
print("下载异常")
gup += 1
continue def download_all_page(pages_url_list, file_path, key_url, key_word):
'''通过调用函数download_each_page(),
来下载所有页面的图片 '''
pages_num = len(pages_url_list)
print('\n相册一共有 {0} 页,已经开始下载请您耐心等待...'.format(str(pages_num))) page = 1 #页数标记
for page_url in pages_url_list:
grupic_url_list = []
get_grupic_url(page_url, grupic_url_list, key_url, key_word)
file_path1 = file_path + r'\{0}'.format(str(page))
download_each_page(grupic_url_list, file_path1, page)
page += 1 def download_each_group(grupic_url, file_path, h1_string, gup, n = 1):
'''
进入链接为grupic_url的图册,下载我们需要的大图片,
并递归进入下一个页面开始下载,直到图册的h1标题发生改变 '''
new_file_path = file_path + '_{0}.jpg'.format(str(n))
n += 1
html = get_html_text(grupic_url)
soup = BeautifulSoup(html, 'html.parser')
#当该页面的h1标题和小相册封面的h1标题相同时开始下载
if h1_string == soup.h1.string:
#找到属性class_ = 'pic-large'的img标签
img_tags = soup.find_all('img', class_ = 'pic-large')
img_tag = img_tags[0]
#下载该img标签属性data-original提供的url链接,即为目标图片的链接
urllib.request.urlretrieve(img_tag.get('data-original'), new_file_path)
#获取下一个页面的链接
next_url = img_tag.parent.get('href')
print('第 {0} 组:{1}, 第 {2} 张下载完成啦'.format(str(gup), h1_string, str(n-1)))
#递归下载下一个页面的目标图片
download_each_group(next_url, file_path, h1_string, gup, n)
#当h1标题不同时,说明进入到了另一个小相册,结束递归
return None def get_h1_string(url):
'''
获取网址为url网站的h1标签内容 '''
try:
html = get_html_text(url)
soup = BeautifulSoup(html, 'html.parser')
return soup.h1.string
except:
print('h1标题获取异常')
return '' def select_atag(grupic_url_list, atags, key_url, key_word):
for atag in atags:
atag_string = str(atag)
soup = BeautifulSoup(atag_string, 'html.parser')
p = soup.p
url = atag.get('href')
if soup.img and p and re.search(key_word, p.string) and re.match(key_url, url):
grupic_url_list.append(atag.get('href')) def main():
'''
主函数 '''
#封面的url链接,也就是第一页的url链接
cover_url = 'http://www.win4000.com/mt/yangzi.html'
#小相册链接中有别于其他链接的特征字符串
key_url = r'http://www.win4000.com/meinv'
key_word = '杨紫'
#图片存放的目录
file_path = r'G:\pictures\yangzi' #存放所有页面链接的列表
pages_url_list = []
#先将封面,即第一页加入列表
pages_url_list.append(cover_url) #获取其他页面的链接
get_allpages_url(cover_url, pages_url_list) #下载所有页面中所有图片的函数
download_all_page(pages_url_list, file_path, key_url, key_word) main()

python爬虫入门---第三篇:自动下载图片的更多相关文章

  1. python爬虫入门---第三篇:保存一张图片

    import requests import os url = 'http://imgsrc.baidu.com/forum/w%3D580%3B/sign=749ed018cecec3fd8b3ea ...

  2. python 爬虫入门----案例爬取上海租房图片

    前言 对于一个net开发这爬虫真真的以前没有写过.这段时间学习python爬虫,今天周末无聊写了一段代码爬取上海租房图片,其实很简短就是利用爬虫的第三方库Requests与BeautifulSoup. ...

  3. Python爬虫入门教程 25-100 知乎文章图片爬取器之一

    1. 知乎文章图片写在前面 今天开始尝试爬取一下知乎,看一下这个网站都有什么好玩的内容可以爬取到,可能断断续续会写几篇文章,今天首先爬取最简单的,单一文章的所有回答,爬取这个没有什么难度. 找到我们要 ...

  4. Python爬虫入门教程 26-100 知乎文章图片爬取器之二

    1. 知乎文章图片爬取器之二博客背景 昨天写了知乎文章图片爬取器的一部分代码,针对知乎问题的答案json进行了数据抓取,博客中出现了部分写死的内容,今天把那部分信息调整完毕,并且将图片下载完善到代码中 ...

  5. Python爬虫入门这一篇就够了

    何谓爬虫 所谓爬虫,就是按照一定的规则,自动的从网络中抓取信息的程序或者脚本.万维网就像一个巨大的蜘蛛网,我们的爬虫就是上面的一个蜘蛛,不断的去抓取我们需要的信息. 爬虫三要素 抓取 分析 存储 基础 ...

  6. Python 爬虫入门(三)—— 寻找合适的爬取策略

    写爬虫之前,首先要明确爬取的数据.然后,思考从哪些地方可以获取这些数据.下面以一个实际案例来说明,怎么寻找一个好的爬虫策略.(代码仅供学习交流,切勿用作商业或其他有害行为) 1).方式一:直接爬取网站 ...

  7. python爬虫入门(三)XPATH和BeautifulSoup4

    XML和XPATH 用正则处理HTML文档很麻烦,我们可以先将 HTML文件 转换成 XML文档,然后用 XPath 查找 HTML 节点或元素. XML 指可扩展标记语言(EXtensible Ma ...

  8. python爬虫入门---第四篇:网站对爬虫的限制及突破测试

    大部分网站对网络爬虫都有限制,限制方式有两种: 一.Robots协议:二.网站通过判断对网站访问http的头部信息来查看是否是爬虫,并对爬虫做相关拦截 第一种限制是书面限制,第二种是强制性阻拦限制.那 ...

  9. 3.Python爬虫入门三之Urllib和Urllib2库的基本使用

    1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器解释才呈现出来的,实质它是一段HTML代码,加 JS.CSS ...

随机推荐

  1. 2月第3周业务风控关注|上海网信办复测23个被约谈APP 涉及1号店、小红书等

    易盾业务风控周报每周呈报值得关注的安全技术和事件,包括但不限于内容安全.移动安全.业务安全和网络安全,帮助企业提高警惕,规避这些似小实大.影响业务健康发展的安全风险. 1.上海网信办复测23个被约谈A ...

  2. Java中List, Integer[], int[]的相互转换

    import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Mai ...

  3. Web开发经验谈之F12开发者工具/Web调试[利刃篇]

    引语:如今的整个Web开发行业甚至说整个软件开发行业,已经相当成熟,基本上已经很少找不到没有前人做过的东西了,或者换句话说,你想要实现的功能,你总能在某个地方搜索到答案,关键是你有没有这个时间精力去搜 ...

  4. Spring boot 使用 configuration 获取的属性为 null

    1. 未设置 getter(),setter()方法,导致属性值注入失败: 2. spring 未扫描到该组件,在其他类中注入该对象失败,可在配置类添加 @configuration 或者 @comp ...

  5. django配置celery

    官网详尽的django结合celery的配置步骤 在django项目settings.py所在的目录中新建一个celery.py,内容如下 from __future__ import absolut ...

  6. [源码]python Scapy Ftp密码嗅探

    [源码]python Scapy Ftp密码嗅探 原理很简单,FTP密码明文传输的 截取tcp 21端口User和Pass数据即可 Scapy框架编译程序较大(一个空程序都25M),所以就不提供exe ...

  7. 【sping揭秘】21、Spring动态数据源的切换

    对于多个数据源的时候,我们如何切换不同的数据源进行数据库的操作呢? 当然我们可以直接定义2个DataSource,然后在每次获取connection的时候,从不同的DataSource中获取conne ...

  8. 移动端真机调试终极利器-BrowserSync(使用方法)

    1. 安装 Node.js BrowserSync是基于Node.js的, 是一个Node模块, 如果您想要快速使用它,也许您需要先安装一下Node.js 安装适用于Mac OS,Windows和Li ...

  9. 杭州富阳场口科目四考试公交路线(西溪北苑->场口)

    从西溪北苑出发,时间充裕,比较悠闲,打算坐公交前往,也打算做下科目四模拟题,顺便欣赏沿途的风景(去的时候需要看题目,回来的时候可以放松,哈哈哈),路线如下. 早上7点半出发,出去吃个早餐,步行到文一社 ...

  10. 从零开始学 Web 之 CSS3(四)边框图片,过渡

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...