目的:爬取一个网站的所有图片
调用库:requests库,BeautifulSoup库
程序设计:
1.函数getHTML():用于获取url的html文本
代码如下
def getHTML(url):
try:
r=requests.get(url,headers={'user-agent':'Mozilla/5.0'})
r.raise_for_status()
r.encoding=r.apparent_encoding
return r.text
except:
print('Fail')
该函数的注意事项是记得利用try except 的处理异常操作的方法来返回一个r.text
2.函数geturl():用于获得图片格式的url,在此处调用BeautifulSoup库
代码如下
def geturl(html,ulist):
soup=BeautifulSoup(html,'html.parser')
alist=soup.find_all('img')
for i in range(len(alist)):
ulist.append(alist[i].attrs['src'])
print(ulist)
该段函数的注意事项是利用soup的find_all()方法来返回一个包含图片链接的所有标签列表,值得注意的是返回的这个列表的每个元素都是BF库解析过的html文件,所以不需要再次调用BF函数解析,我自己调了好久才发现》》》,最后将列表每个标签元素的attrs[’src‘]添加到ulist这个结果列表中
3.函数download(),再次利用requests库的get方法,以及os库来保存文件
代码如下
def download(url):
root='D:/pics/'
path=root+url.split("/")[-1]
print(path)
try:
if not os.path.exists(root):
os.mkdir(root)
if not os.path.exists(path):
r=requests.get(url)
r.raise_for_status()
with open(path,'wb') as k:
k.write(r.content)
k.close()
print("文件保存成功")
else:
print("文件已存在")
except:
print("失败")
该段函数的注意事项是1.在这段函数中对程序进行了兼容性优化,那就是调用了os库来检查该电脑有没有root这个根目录,如果没有就利用os.mkdir()方法创建这个root目录,再将图片文件写入
4.最后使用一个主函数main()来调用以上三个函数来达到目的的实现
代码如下
def main():
ulist=[]
url=str(input('输入网址'))
html=getHTML(url)
geturl(html,ulist)
for k in ulist:
download(k)
print('finish')
该段代码的注意事项是注意到用一个for循环来调用download函数从而写入所有图片文件,在这里我遇到一点小麻烦,一开始我是直接将for循环加到download函数中,但是运行就会一直报错,这里我还没有想通第一次方法为什么不可行
这个程序对于部分网址无法进行有效的爬取,这个坑可以以后学了更深的爬虫知识再来解决。