今天转转悠悠,突然不知道该学些什么,偶然的一瞬间脑子里想到了爬虫,这个我很早就了解的技术,我却没有亲自实践过,于是这次想好好地去了解下,学习下简单的使用方法,毕竟自以后的深度学习中也是有用处的,爬取图片来做数据源。
一:简单入手
网络的上的图片都有所在服务器URL。
我们首先得获得一个可以发起HTTP请求的办法,我们使用requests包的方法。
做个简单的实验,把www.baidu.com的首页HTML请求下来。
import requests #导入模块
def run(): #声明一个run方法
response = requests.get("http://www.baidu.com")
print(response.text)
if __name__ == "__main__": #主程序入口
run() #调用上面的run方法
发现是可以的。
然后我们去一个图片网站上去爬取一些图片下来,刚刚我们是爬取HTML,现在我们尝试爬取图片
import requests #导入模块
def run2():
response = requests.get("http://wx3.sinaimg.cn/large/0076BSS5ly1gliowcgks1j30u0112wjn.jpg")
with open("D:/estimages/mn.jpg", "wb") as f :
f.write(response.content)
f.close
if __name__ == "__main__": #主程序入口
run2() #调用上面的run方法
图片也是顺利下载了,我们看一看
二:实战操作
我们今天要爬取的是网站http://jandan.net/ooxx,这里有很多评论内容,每个评论下都是有一张图片的,而且评论内容很多,都有分页了,有分页也不怕,因为分页的内容都是一样的,我们来细看。
网页内容有分页
检查源码如下:
也就是如果我们想跳到下一页面,只需要把这个“下一页”的< a>的herf链接值得到,重新使用request请求一下这个链接值就能调到下一页面,循环执行的话,就能不断根据连接进行爬取。
经过观察,每个下一页的< a>标签都属于一个previous-comment-page的calss,这个很重要,能方便BeautifulSoup直接能获取该元素。
每个页面分页栏下面接着就是一个大的评论区,每个评论都是有一张图片,很规律。
检查源码如下:
可以看出来这是一个comment列表,每一个comment都有一个ID。
我们需要进去每一个ID去看看图片的位置和内容,如下:
经过观察,每个图片的src url值和【查看原图】的herf url值是一样的,【查看原图】的< a>值都是属于一个view-img-link的calss,这个很重要,能方便BeautifulSoup直接能获取该元素。
BeautifulSoup是一个方便能直接访问HTML元素的包。
配合上requests就能实现一个简单的图片爬取功能了。
完整源码如下:
直接上代码学习BeautifulSoup和request的用法吧。
import os
import requests
from bs4 import BeautifulSoup
class Config:
page_num = 3
save_dir = 'D:\estimages'
opt = Config()
if not os.path.exists(opt.save_dir):
os.mkdir(opt.save_dir)
# 设置URL的请求头
headers = {'referer': 'http://jandan.net/',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0'}
# 这是一个集合,不能重复,也就是不能重复设置
image_cache = set()
index = len(image_cache)
# 保存图片
def save_all_images(html, idx):
global index
for link in html.find_all('a', {'class': 'view_img_link'}):
href = link.get('href')
if href not in image_cache:
print("image: http:" + href)
with open(
'{}/{}'.format(opt.save_dir, href.split("/")[-1]), 'wb') as jpg: # 请求图片并写进去到本地文件
jpg.write(requests.get("http:" + href).content)
image_cache.add(href)
print("正在抓取第%s条数据" % index)
index += 1
def findAnotherPage(html):
ahref = html.find('a', {'class': 'previous-comment-page'}) # 找到导航条的位置,获得下一个连接网页的位置
if ahref is None:
print('no more page')
exit(0)
else:
url = "http:" + ahref.get('href')
print("next page: " + url)
return url
if __name__ == '__main__':
url = 'http://jandan.net/ooxx'
for i in range(0, opt.page_num):
html = BeautifulSoup(requests.get(url, headers=headers).text, features="html.parser")
save_all_images(html, i)
url = findAnotherPage(html)
代码步骤如下:
1:设置必要的参数,比如我们需要爬取几个页面,图片在本地的存储位置。
2:设置一个set集合,图片不能重复,因此每下载一张图片就记录这个图片的url。
3:真正下载的时候,每调到一个页面就把该页面的comment区域的所有图片请求下;来。
4:根据分页栏的下一页面地址,调到新的页面,重复执行第三步骤。
下载的时候我们把原始文件名完整保存了下来,并且把url记录在set,避免重复下载。
效果如下: