爬虫刚入门,用BeautifulSoup来练手。
本篇文章前提是安装好了BeautifulSoup、requests模块,还需要内置的os模块。
爬取的网址为:http://www.itcast.cn/channel/teacher.shtml#ajavaee
- 首先,载入模块
import requests from bs4 import BeautifulSoup import os
-
然后就是基本的爬取操作:
ul = 'http://www.itcast.cn/channel/teacher.shtml#ajavaee' html = requests.get(ul).text main_url = 'http://www.itcast.cn' # print(html) soup = BeautifulSoup(html, 'lxml') img_ul = soup.find_all('div', {'class': 'li_img'})
这里要注意一点,得到的img_ul类型是ResultSet,意思是标签,并不是正儿八经的字符串。有兴趣的朋友可以print一下或者debug看看结果。
需要 注意的是,因为分析网页的时候发现,图片网址和当前网页的网址不完全相同,故增加了一个main_url,以备下面的读取图片网址用。
-
此时,网页已经变成了一碗美味的“汤汁”。右键图片审查元素可得到图片的对应的代码:
-
可以看到图片的网页并不是设置的“ul”,正好解释了第二步。接着创建一个文件夹准备“收货”。
os.makedirs('./传播智客/', exist_ok=True) # 在当前程序的文件夹下创建一个“传播智客”的文件夹
关于os的用法,可以参考各种基础教程。
-
因为这碗汤里啥都有,想吃的肉还得自己找。所以下一步就是找到图片网址对应的代码:
for ul in img_ul: imgs = ul.find_all('img') # print(imgs) for img in imgs: url = img['data-original'] img_name = url.split('/')[-1] req = requests.get(main_url+url, stream=True) with open('./传播智客/%s' % img_name, 'wb') as f: for chunk in req.iter_content(chunk_size=128): f.write(chunk) print('Saved %s' % img_name)
那么提取里面的内容就需要用到关键字标签,如上代码所示。
本来打算用正则表达式“re.findall(xxxx)”提取网址,结果报错了。所以就没用到re模块。
-
with open('./传播智客/%s' % img_name, 'wb') as f: for chunk in req.iter_content(chunk_size=128): f.write(chunk)
这一段是跟 莫烦 学的。普通方法就是把所有的图片下载到内存里,再一个个存到电脑的硬盘上。对于少量的数据还可行,对于本例子也可行,但想想如果要爬一个20G 的视频呢?内存恐怕要被撑爆。这种方法说白了就是边下边存,本例子中,下载满128byte即存到硬盘上,然后再下再存。chunk_size=xx即定义了满多少字节存一次。
-
结果:
-
完整版代码:
import requests from bs4 import BeautifulSoup import os ul = 'http://www.itcast.cn/channel/teacher.shtml#ajavaee' html = requests.get(ul).text main_url = 'http://www.itcast.cn' # print(html) soup = BeautifulSoup(html, 'lxml') img_ul = soup.find_all('div', {'class': 'li_img'}) os.makedirs('./传播智客/', exist_ok=True) for ul in img_ul: imgs = ul.find_all('img') # print(imgs) for img in imgs: url = img['data-original'] img_name = url.split('/')[-1] req = requests.get(main_url+url, stream=True) with open('./传播智客/%s' % img_name, 'wb') as f: for chunk in req.iter_content(chunk_size=128): f.write(chunk) print('Saved %s' % img_name)