python3爬虫简易入门图片_python爬虫入门---第三篇:自动下载图片

importrequestsimportreimporturllibfrom bs4 importBeautifulSoupdefget_html_text(url):'''获取网址url的HTML代码,以字符串形式返回html代码'''

try:

res= requests.get(url, timeout = 6)

res.raise_for_status()

res.encoding=res.apparent_encodingreturnres.textexcept:return ''

print('请求异常')defget_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_tags = soup.find_all('a', attrs = {'href':True})

select_atag(grupic_url_list, a_tags, key_url, key_word)

defget_allpages_url(cover_url, pages_url_list):'''通过递归获取所有页面的链接,

直到该页面不存在class = 'next'的标签'''html=get_html_text(cover_url)

soup= BeautifulSoup(html, 'html.parser')#找到属性class = 'next'的标签

a_tags = soup.find_all('a', class_ = 'next')#如果标签存在,就将该标签的url加入列表

ifa_tags:

nextpage_url= a_tags[0].get('href')

pages_url_list.append(nextpage_url)#递归获取下一个页面的标签

get_allpages_url(nextpage_url, pages_url_list)#当不存在属性class = 'next'的标签时,说明这是最后一页,结束递归

returnNonedefdownload_each_page(grupic_url_list, file_path1, page):'''通过调用download_each_group()函数,

下载每一页中的所有组图'''

print('\n\n第 {0} 页开始下载:\n'.format(str(page)))

gup= 1 #组数标记

#下载该页面中每个小相册的所有图片

for grupic_url ingrupic_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

defdownload_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 inpages_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+= 1html=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标题不同时,说明进入到了另一个小相册,结束递归

returnNonedefget_h1_string(url):'''获取网址为url网站的h1标签内容'''

try:

html=get_html_text(url)

soup= BeautifulSoup(html, 'html.parser')returnsoup.h1.stringexcept:print('h1标题获取异常')return ''

defselect_atag(grupic_url_list, atags, key_url, key_word):for atag inatags:

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) andre.match(key_url, url):

grupic_url_list.append(atag.get('href'))defmain():'''主函数'''

#封面的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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值