闲来无事看了半天Python语法,写了一个图片抓取脚本,功能也比较单一,目前已实现功能:
1.获取首页所有包含图片的网页地址。
2.一一将首页获取的地址打开,获取单页下面的所有图片地址。
3.下载单页包含的所有图片到img目录下。
4.查找翻页参数,如果有下一页,页码+1后递归下载每页图片。
注:请勿频繁抓取数据,对服务器压力较大,请大家都做有素质的网民。数据来源于网络,侵权请告知。
运行示例:
源代码:
import os
import time
import urllib
import requests
import re
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36'
}
# 单页数据遍历
def getImages(img_url, page):
page_url = img_url
# 如果页码大于0,说明需要翻页,拼装页码
if page > 1:
page_url = img_url + '/' + str(page)
print(f'加载翻页数据:{page_url}')
response = requests.get(page_url, headers=headers)
html = response.text
# urls = re.findall('<img alt=".*?" class="alignnone size-full" data-src=".*?"', html)
try:
# 判断是否有下一页
next_page = '<i class="iconfont icon-arrowright"></i>'
# 如果有下一页,页码+1
if re.search(next_page, html).group():
page = page + 1
else:
page = 1
except AttributeError:
page = 1
urls = re.findall('<a href=".*?" alt=".*?" title=".*?">', html)
print(f'页面全部A标签:{urls}')
for url in urls:
item_content = re.search('<a href="(.*)" alt.*?title="(.*)"', url)
name = item_content.group(1)[:]
title = item_content.group(2)[:]
name = name.split('&')[0]
name = urllib.parse.unquote(name)
print(f'处理后的名称:{name}')
time.sleep(5)
file_name = name.split('/')[-1]
print(f'开始下载图片:{file_name}')
path = './imgs/' + title
img_path = path + '/' + file_name
# 存在相同图片,跳过此次下载
if os.path.exists(img_path):
print(f'重复图片,跳过下载:{file_name}')
continue
isExists = os.path.exists(path)
# 创建目录
if not isExists:
os.makedirs(path)
# 下载图片
response = requests.get(name, headers=headers)
with open(img_path, 'wb') as f:
f.write(response.content)
f.close()
if page > 1:
getImages(img_url, page)
response = requests.get('https://www.vmgirls.com', headers=headers)
print(response.request.headers)
html = response.text
print(response.text)
main_urls = re.findall('https://www.vmgirls.com/(\d.*).html', html)
main_urls = {}.fromkeys(main_urls).keys()
print('获取到资源页面:', main_urls)
# 取单页数据进行抓取
for url in main_urls:
full_url = 'https://www.vmgirls.com/' + url + '.html'
print(f'开始爬取:{full_url} 数据。')
getImages(full_url, 1)