背景:
在学习了简单爬虫的编写之后,我试图通过编写爬取公众号图片(表情包)来丰富我的聊天技能,亦不致于败给各种熊猫头。
在学习了requests库之后,就能够很轻松地爬取静态页面的信息,把网页对象获取到本地。但是此时如何把复杂的网页信息解析出来,便需要使用到正则表达式或者这次分享的BeautifulSoup库。BeautifulSoup是非常好用的第三方解析器,具体介绍和使用参考官方说明文档
调用方法:
from bs4 import BeautifulSoup
算法思路
用到的主要第三方库有Re库、Requests库和BeautifulSoup库。
此后我编写了getHTMLText()函数获得指定url的html信息,编写了getimgURL()函数得到某一篇文章里的所有图片链接,再编写download(adlist)函数新建或打开文件夹下载并保存图片,最后在主函数给出想要爬取的公众号文章地址,依次调用函数运行即可。
1.获取网页信息
使用requests库的get函数定义获取网页信息的函数:
def getHTMLText(url):
try:
r=requests.get(url,timeout=30)
r.raise_for_status()
r.encoding=r.apparent_encoding
return r.text
except:
return ""
2.解析网页,获取所有图片url
调用BeautifulSoup库,使用find_all()函数查找网页img标签下的信息,再通过正则表达式获取url并存入adlist列表之中。对比上一篇爬取旧书网的心得,可以发现使用BeautifulSoup库和正则表达式的组合形式可以极其有效地解析网页,而且不至于出现解析错误。
def getimgURL(html):
soup = BeautifulSoup(html , "html.parser")
adlist=[]
for i in soup.find_all("img"):
try:
ad= re.findall(r'.*src="(.*?)?" .*',str(i))
if ad :
adlist.append(ad)
except:
continue
return adlist
3.新建文件夹pic,下载并保存爬取的图片信息
先设定需要下载路径root,然后判断路径是否存在,若不存在则新建路径,然后get()函数通过上面获得的图片链接进行下载,并保存在指定路径。
def download(adlist):
#注意更改文件目录
root="C:\\Users\yllzxzyq\Desktop\pics\\"
for i in range(len(adlist)):
path=root+str(i)+"."+‘tif’
if not os.path.exists(root):
os.mkdir(root)
if not os.path.exists(path):
r=requests.get(adlist[i][0])
with open(path,'wb') as f:
f.write(r.content)
f.close()
4.主函数
给出url,依次调用上述函数,爬取公众号文章的全部图片,存在指定目录。
def main():
url = 'https://mp.weixin.qq.com/s/iX-6WDd21W4k21MDp0RYDA'
html=getHTMLText(url)
list=getimgURL(html)
download(list)
main()
附一下全部源码链接:
import requests
from bs4 import BeautifulSoup
import re
import os
#获取网页信息
def getHTMLText(url):
try:
r=requests.get(url,timeout=30)
r.raise_for_status()
r.encoding=r.apparent_encoding
return r.text
except:
return ""
#解析网页,获取所有图片url
def getimgURL(html):
soup = BeautifulSoup(html , "html.parser")
adlist=[]
for i in soup.find_all("img"):
try:
ad= re.findall(r'.*src="(.*?)?" .*',str(i))
if ad :
adlist.append(ad)
except:
continue
return adlist
#新建文件夹pic,下载并保存爬取的图片信息
def download(adlist):
#注意更改文件目录
root="C:\\Users\yllzxzyq\Desktop\图片\\"
for i in range(len(adlist)):
path=root+str(i)+"."+'gif'
if not os.path.exists(root):
os.mkdir(root)
if not os.path.exists(path):
r=requests.get(adlist[i][0])
with open(path,'wb') as f:
f.write(r.content)
f.close()
def main():
url = 'https://mp.weixin.qq.com/s/iX-6WDd21W4k21MDp0RYDA'
html=getHTMLText(url)
list=getimgURL(html)
download(list)
main()
希望有所帮助,感谢阅读。