本文介绍两种爬取方式:

1.正则表达式

2.bs4解析Html

以下为正则表达式爬虫,面向对象封装后的代码如下:

import urllib.request  # 用于下载图片
import os
import requests # 发送http请求
import re # 正则表达式匹配 class GetJpg(object): def __init__(self, start_urls):
self.start_urls = start_urls def get_response(self,url): '''获取网页响应内容''' response = requests.get(url).text
return response def get_content(self,html): '''获取网页响应内容中所有图片的整体div部分''' reg = re.compile(r'(<div class="j-r-list-c">.*?</div>.*?</div>)', re.S)
return re.findall(reg, html) def get_jpg_url(self,content): '''获取图片url''' reg = r'data-original="(.*?)"'
return re.findall(reg, content) def get_jpg_name(self,content): ''' 获取图片名称''' reg = re.compile(r'<a href="/detail-.{8}.html">(.*?)</a>')
return re.findall(reg, content) def download_jpg(self,src_url, path,index): '''下载图片保存到本地目录''' path = ''.join(path.split())
path = 'E:\Python\爬图片\{name}.{index}'.format(name=path,index=index)
if not os.path.exists(path):
urllib.request.urlretrieve(src_url, path) # 下载图片
print('OK!!!')
else:
print('文件已存在') def get_url_name(self,start_url): ''' 逐页下载,本部分本来可以放在main函数里,考虑到会多嵌套一个循环所以单独拿出来作为一个函数''' content = self.get_content(self.get_response(start_url))
for i in content:
jpg_url = self.get_jpg_url(i)
if jpg_url:
jpg_name = self.get_jpg_name(i)
index = jpg_url[0].split('.')[-1]
try:
self.download_jpg(jpg_url[0], jpg_name[0],index)
except:
continue def main(self): ''' 执行''' [self.get_url_name(start_url) for start_url in self.start_urls] # 此处列表生成器来执行
# 这部分的代码相当于:
# for start_url in self.start_urls:
# self.get_url_name(start_url) if __name__ == '__main__':
start_urls = ['http://www.budejie.com/{id}'.format(id=i) for i in range(1,10)]
jpg = GetJpg(start_urls) # 实例化一个对象
jpg.main()

以下为使用bs4爬取的代码:

from bs4 import BeautifulSoup
import urllib.request
import re def get_urls(img_girl):
'''
:param img_girl: <img>标签内容
:return: 所有图片的url
'''
all_urls = [girl.get('src') for girl in img_girl]
return all_urls def get_img_name(img_girl):
'''
:param img_girl: <img>标签内容
:return: 所有图片title
''' all_name = [girl.get('title') for girl in img_girl]
return all_name def get_img_resource(url):
'''
:param url:网站url
:return:网页源码中的所有<img>标签内容
'''
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36',
'Accept - Language': 'zh - CN, zh;q = 0.8'
} # 添加请求头部,模拟浏览器
req = urllib.request.Request(url, headers=headers) # 创建对象
res = urllib.request.urlopen(req, timeout=20) # 发送请求
content = res.read() # 获取响应网页源码
soup = BeautifulSoup(content,'html.parser') # HMTL源码解析
img_girl = soup.find_all('img') # 获取 源码中的<img>标签模块内容
return img_girl def main(url):
'''
下载保存图片
:param url: 网站url
'''
urls = get_urls(get_img_resource(url))
names = get_img_name(get_img_resource(url))
x = 1
for src_url in urls:
path_l = re.split(r'\W', names[urls.index(src_url)]) # 去除图片名称中的特殊字符,不然文件名可能在保存的时候报错
path = ''.join(path_l)
path = 'E:\Python\爬图片\BS4\{name}_{index}.jpg'.format(name=path,index=x)
urllib.request.urlretrieve(src_url, path)
print('OK')
x += 1 if __name__ == "__main__":
urls = ['https://www.dbmeinv.com/dbgroup/show.htm?cid=4&pager_offset={i}'.format(i=id)for id in range(1,10) ]
[main(url)for url in urls]

bs4面向对象封装后代码:

from bs4 import BeautifulSoup
import urllib.request
import re class GetWebImg(object): def __init__(self, url, index):
self.url = url
self.index = index def get_urls(self,img_girl):
'''
:param img_girl: <img>标签内容
:return: 所有图片的url
'''
all_urls = [girl.get('src') for girl in img_girl]
return all_urls def get_img_name(self,img_girl):
'''
:param img_girl: <img>标签内容
:return: 所有图片title
''' all_name = [girl.get('title') for girl in img_girl]
return all_name def get_img_resource(self, url):
'''
:param url:网站url
:return:网页源码中的所有<img>标签内容
'''
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36',
'Accept - Language': 'zh - CN, zh;q = 0.8'
} # 添加请求头部,模拟浏览器
req = urllib.request.Request(url, headers=headers) # 创建对象
res = urllib.request.urlopen(req, timeout=20) # 发送请求
content = res.read() # 获取响应网页源码
soup = BeautifulSoup(content, 'html.parser') # HMTL源码解析
img_girl = soup.find_all('img') # 获取 源码中的<img>标签模块内容
return img_girl def main(self):
'''
下载保存图片
:param url: 网站url
'''
url_list = self.get_urls(self.get_img_resource(self.url))
name_list = self.get_img_name(self.get_img_resource(self.url))
x = 1
for src_url in url_list:
path_l = re.split(r'\W', name_list[url_list.index(src_url)]) # 去除图片名称中的特殊字符,不然文件名可能在保存的时候报错
path = ''.join(path_l)
path = 'E:\Python\爬图片\BS4\{name}_{index}_{id}.jpg'.format(name=path, index=self.index,id =x)
urllib.request.urlretrieve(src_url, path)
print('第{index}页第{id}张图片下载OK'.format(index=self.index,id =x))
x += 1 if __name__ == "__main__":
urls = ['https://www.dbmeinv.com/dbgroup/show.htm?cid=4&pager_offset={i}'.format(i=id)for id in range(1,10) ]
index = 1
for url in urls:
get_img = GetWebImg(url,index)
get_img.main()
index += 1

运行结果:

python网络爬虫抓取网站图片的更多相关文章

  1. 如何利用Python网络爬虫抓取微信朋友圈的动态(上)

    今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌 ...

  2. 利用Python网络爬虫抓取微信好友的签名及其可视化展示

    前几天给大家分享了如何利用Python词云和wordart可视化工具对朋友圈数据进行可视化,利用Python网络爬虫抓取微信好友数量以及微信好友的男女比例,以及利用Python网络爬虫抓取微信好友的所 ...

  3. 利用Python网络爬虫抓取微信好友的所在省位和城市分布及其可视化

    前几天给大家分享了如何利用Python网络爬虫抓取微信好友数量以及微信好友的男女比例,感兴趣的小伙伴可以点击链接进行查看.今天小编给大家介绍如何利用Python网络爬虫抓取微信好友的省位和城市,并且将 ...

  4. 如何利用Python网络爬虫抓取微信好友数量以及微信好友的男女比例

    前几天给大家分享了利用Python网络爬虫抓取微信朋友圈的动态(上)和利用Python网络爬虫爬取微信朋友圈动态——附代码(下),并且对抓取到的数据进行了Python词云和wordart可视化,感兴趣 ...

  5. Python入门-编写抓取网站图片的爬虫-正则表达式

    //生命太短 我用Python! //Python真是让一直用c++的村里孩子长知识了! 这个仅仅是一个测试,成功抓取了某网站1000多张图片. 下一步要做一个大新闻 大工程 #config = ut ...

  6. python网络爬虫抓取动态网页并将数据存入数据库MySQL

    简述以下的代码是使用python实现的网络爬虫,抓取动态网页 http://hb.qq.com/baoliao/ .此网页中的最新.精华下面的内容是由JavaScript动态生成的.审查网页元素与网页 ...

  7. 使用selenium实现简单网络爬虫抓取MM图片

    撸主听说有个网站叫他趣,里面有个社区,其中有一项叫他趣girl,撸主点进去看了下,还真不错啊,图文并茂,宅男们自己去看看就知道啦~ 接下来当然就是爬取这些妹子的图片啦,不仅仅是图片,撸主发现里面的对话 ...

  8. Python -- 网络编程 -- 抓取网页图片 -- 豆瓣妹子

    首先分析页面URL,形如http://dbmeizi.com/category/[1-14]?p=[0-476] 图片种类对应编号: 1:'性感', 2:'有沟', 3:'美腿', 4:'小露点', ...

  9. Python -- 网络编程 -- 抓取网页图片 -- 图虫网

    字符串(str)编码成字节码(bytes),字节码解码为字符串 获取当前环境编码:sys.stdin.encoding url编码urllib.parse.quote() url解码urllib.pa ...

随机推荐

  1. synchronized Lock

    synchronized和Lock都是Java语言提供的两种实现对共享资源进行同步的机制.其中synchronized使用Object对象本身的wait().notify().notifyAll()方 ...

  2. [转]sqlmap使用教程

    sqlmap也是渗透中常用的一个注入工具,其实在注入工具方面,一个sqlmap就足够用了,只要你用的熟,秒杀各种工具,只是一个便捷性问题,sql注入另一方面就是手工党了,这个就另当别论了. 今天把我一 ...

  3. MySQL中varchar与char区别

    MySQL中varchar与char区别(转) MySQL中varchar最大长度是多少? 一. varchar存储规则: 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字 ...

  4. NOIP2016原题终结测试(2017081801)

    NOIP2016还有几道原题没有写掉,今天就一并布置掉. 答案的问题,有部分会先放到NOIP题解中,是单独发布的. 最后会汇总放在答案中,各位不要急. 还有,后期会有原创题测试,这个不急,反正11月才 ...

  5. python学习 day4 (3月5日)---列表

    列表: 容器性数据 有序  可更改 大量数据 一.增 1.追加    append(objcet) 2.索引增加   Insert(index,元素) 3.迭代追加   extend(object) ...

  6. 2019.01.20 bzoj3999: [TJOI2015]旅游(树链剖分)

    传送门 树链剖分菜题. 题意不清差评. 题意简述(保证清晰):给一棵带权的树,每次从aaa走到bbb,在走过的路径上任意找两个点,求后访问的点与先访问的点点权差的最大值. 思路: 考虑暴力:维护路径的 ...

  7. 2018.11.08 NOIP模拟 水管(简单构造)

    传送门 仔细读题会发现只要所有点点权之和等于0一定有解. 如何构造? 直接当做树来构造就行了,非树边都赋值成0就行. 代码

  8. C++STL 函数对象和谓词

    函数对象:重载函数调用操作符的类,其对象常称为函数对象. 函数对象属于类对象,能突破函数概念,保持类的状态 谓词: 一元函数对象:函数参数1个: 二元函数对象:函数参数2个: 一元谓词 函数参数1个, ...

  9. C++STL容器重点

    string 查找和替换 vector 删除

  10. s5-1 CPU调度

    基本概念 通过多道程序设计得到 CPU 的最高利用率 (CPU-- I/O 脉冲周期 - - 进程的执行包括进程在 CPU 上执行和等待 I/O ) 进程的执行以 CPU 脉冲开始,其后跟着 I/O ...