前言
最近在学习python爬虫,这是一个练手的小项目。
参考资料:
- 深入Python3
- Python官方文档
- 正则表达式30分钟入门教程
- 谷歌各种教程
简介
目标网站:煎蛋妹子图
主要功能:新建一个文件夹,然后爬取页面,下载妹子图,每页的图分别放进一个文件夹,效果如下:
文件夹
文件夹内图片
代码
__author__ = 'Wayne'
import urllib.request
import os
import re
def url_open(url):
req = urllib.request.Request(url)
req.add_header('User-Agent','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:36.0) Gecko/20100101 Firefox/36.0')
response = urllib.request.urlopen(req)
return response.read()
def get_page(url):
html = url_open(url).decode('utf-8')
pattern = r'<span class="current-comment-page">\[(\d{4})\]</span>' #正则表达式寻找页面地址
page = int(re.findall(pattern,html)[0])
return page
def find_imgs(page_url):
pattern = r'<img src="(.*?\.jpg)"'
html = url_open(page_url).decode('utf-8')
img_addrs = re.findall(pattern,html)
return img_addrs
def save_imgs(img_addrs,page_num,folder):
os.mkdir(str(page_num))
os.chdir(str(page_num))
for i in img_addrs:
pattern = r'sinaimg.cn/mw600/(.*?).jpg'
filename = i.split('/')[-1]
image = url_open(i)
with open(filename,'wb') as f:
f.write(image)
f.close()
def download_mm(folder='ooxx',pages=10):
os.mkdir(folder) #新建文件夹
os.chdir(folder) #跳转到文件夹
folder_top = os.getcwd() #获取当前工作目录
url = 'http://jandan.net/ooxx/'
page_num = get_page(url) #获取网页最新的地址
for i in range(pages):
page_num -= i #递减下载几个网页
page_url = url + 'page-' + str(page_num) + '#comments' #组合网页地址
img_addrs = find_imgs(page_url) #获取图片地址
save_imgs(img_addrs,page_num,folder) #保存图片
os.chdir(folder_top)
if __name__ == '__main__':
folder = input("Please enter a folder(default is 'ooxx'): " )
pages = input("How many pages do you wan to download(default is 10): ")
download_mm(str(folder),int(pages))
微信公众号:lyishaou
微信公众号
网友评论
1、文件夹名和页数不输入的话会报错,并不能使用缺省值;
2、def find_imgs(page_url)返回的图片地址只是一部分,缺少http:,直接运行会报403错误;
3、def save_imgs(img_addrs,page_num,folder)里的folder参数应该没用,代码块内的pattern = r'sinaimg.cn/mw600/(.*?).jpg'也没有用到;
4、 for i in range(pages):
page_num -= i #递减下载几个网页
这里并不能按顺序递减,比如 page_num=240,会依次下载240、239、237、234、230、225、219、212、204、195这10页,不知道你就是这样设计的,还是疏忽了?
5、 with open(filename,'wb') as f:
f.write(image)
f.close()
with语句会自己关闭文件,所以 f.close()多余了
试验了一下,遇到几个问题,已解决。
试验环境:Win10,Python3.5, Pycharm 社区版。
问题一:
如果在输入文件名的时候直接回车,那么程序报错,并没有启用缺省的参数,而是使用了一个空量作为folder名称导致程序无法新建文件夹。
解决方法:手动输入文件名即可。
问题二:
会提示“ValueError: unknown url type: '//ww2.sinaimg.cn/mw600/马赛克.jpg'”。原因是urllib.request.request不支持这种格式的url,必须在开头加上“http:”。
解决方法:在url_open函数开头加上“url = re.sub(r'^//*',"http://", url)”即可。
问题三:
在save_imgs函数下,Pycharm提示“ pattern = r'sinaimg.cn/mw600/(.*?).jpg'”是无用语句,我看了一下,好像确实没有用到。
解决方法:不影响使用,可无视之。
提到的解决方法都是治标不治本,不知博主可否有空指点一下如何修改更好?
好想用贴吧的滑稽