首先觉得自己学的东西还不是很多,所以就开始自己的自学之路了。
本文是参照了CSDN 该博主的文章然后我自己去尝试了一下,中间碰到了一点问题最后还是解决了。所以决定写一篇博客来记录一下!
网络爬虫
同义词 爬虫(自动获取网页内容的程序)一般指网络爬虫
本词条由“科普中国”百科科学词条编写与应用工作项目 审核 。
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
个人感觉爬虫还是蛮好玩的。废话不多说直接开始。
1.我是直接把该博主的终极代码直接拷下来了先运行看报错吧。
我把URL 改为慕课网的首页了。
#!/usr/bin/env Python3
# -*- encoding:utf-8 *-*
'''@author = 'Appleyk' '''
'''@time = '2017年9月23日11:42:32' '''
from urllib import request
import re #使用正则表达式
def getResponse(url):
#url请求对象 Request是一个类
url_request = request.Request(url)
#print("Request对象的方法是:",url_request.get_method())
#上下文使用的对象,包含一系列方法
#url_response = request.urlopen(url) #打开一个url或者一个Request对象
url_response = request.urlopen(url_request)
'''
geturl():返回 full_url地址
info(): 返回页面的元(Html的meta标签)信息
<meta>:可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词。
getcode(): 返回响应的HTTP状态代码
100-199 用于指定客户端应相应的某些动作。
200-299 用于表示请求成功。 ------> 200
300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。
400-499 用于指出客户端的错误。 ------> 404
500-599 用于支持服务器错误。
read(): 读取网页内容,注意解码方式(避免中文和utf-8之间转化出现乱码)
'''
return url_response #返回这个对象
def getJpg(data):
jpglist = re.findall(r'src="http.+?.jpg"',data)
return jpglist
def downLoad(jpgUrl,n):
#request.urlretrieve(jpg_link, path)
try:
request.urlretrieve(jpgUrl,'%s.jpg' %n)
except Exception as e:
print(e)
finally:
print('图片%s下载操作完成' % n)
http_response = getResponse("https://coding.imooc.com/") #拿到http请求后的上下文对象(HTTPResponse object)
#print(http_response.read().decode('utf-8'))
data = http_response.read().decode('utf-8')
#print(data)
global n
n = 1
L = getJpg(data)
for jpginfo in L:
print(jpginfo)
s = re.findall(r'http.+?.jpg',jpginfo)
downLoad(s[0],n)
n= n +1
运行结果直接上图:
发现无任何输出但是并没有报错。于是我感觉是图片List或者网页对象为空,所以我加了两行输出代码进去看看输出结果。
输出发现网页对象获取到了,但是图片List为空。然后开始检查 getJpg函数发现正则表达式和慕课网的图片路径不匹配所以无法获取到图片路径导致List为空。
然后把正则表达式改一下就行了。
然后看那个下载图片的函数发现可以指定下载路径于是我就改成了本机中的文件夹路径(注意需要转义)
然后心里就迫不及待的进行运行了。是不是可以成功了勒! 有点小激动啊。。。。
这是运行结果 emmmmmm~ 有点差强人意啊!
然后经过本人的反复思考肯定是那个报错的问题。大概意思是未知的URL路径,我直接把最后一张图片(//img.mukewang.com/user/55ddd8220001580c01800180-100-100.jpg)复制到浏览器中在前面加个 http:试试看能不能访问。
注意,我们要的不是
src=“http://images01.mopimg.cn/imgs/20170922/20170922112551_0e2a19a344fb2f1c27ef438365587a78.jpg”
而是src的值—>
http://images01.mopimg.cn/imgs/20170922/20170922112551_0e2a19a344fb2f1c27ef438365587a78.jpg
因此,我们需要在上述demo的基础上再定义一个下载方法,给urlretrieve函数传第一个参数的时候,需要再次用到正则表达式,来得到真正意义上的 url 图片 地址!
哎呦~~ 不错哦! 机智啊。 也就是说我只需要将每个图片路径上加上http: 就行了。
直接上我自己的DEMO
#!/usr/bin/env Python3
# -*- encoding:utf-8 *-*
from urllib import request
import re # 使用正则表达式
def getResponse(url):
# url请求对象 Request是一个类
url_request = request.Request(url)
# print("Request对象的方法是:",url_request.get_method())
# 上下文使用的对象,包含一系列方法
# url_response = request.urlopen(url) #打开一个url或者一个Request对象
url_response = request.urlopen(url_request)
'''
geturl():返回 full_url地址
info(): 返回页面的元(Html的meta标签)信息
<meta>:可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词。
getcode(): 返回响应的HTTP状态代码
100-199 用于指定客户端应相应的某些动作。
200-299 用于表示请求成功。 ------> 200
300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。
400-499 用于指出客户端的错误。 ------> 404
500-599 用于支持服务器错误。
read(): 读取网页内容,注意解码方式(避免中文和utf-8之间转化出现乱码)
'''
print(url_response)
return url_response # 返回这个对象
#获得网页中所有的图片
def getJpg(data):
jpglist = re.findall(r'src="//img.+?.jpg"', data)
for jpg in jpglist:
print('网页上下载的图片地址为:'+jpg)
return jpglist
#进行图片下载
# urllib模块提供的urlretrieve()函数。urlretrieve()方法直接将远程数据下载到本地。
#
# urlretrieve(url, filename=None, reporthook=None, data=None)
#
# 参数filename指定了保存本地路径(如果参数未指定,urllib会生成一个临时文件保存数据。)
# 参数reporthook是一个回调函数,当连接上服务器、以及相应的数据块传输完毕时会触发该回调,我们可以利用这个回调函数来显示当前的下载进度。
# 参数data指post导服务器的数据,该方法返回一个包含两个元素的(filename, headers) 元组,filename 表示保存到本地的路径,header表示服务器的响应头
def downLoad(jpgUrl, n):
# request.urlretrieve(jpg_link, path)
try:
request.urlretrieve(jpgUrl, 'E:\\简单爬虫图片下载测试\\%s.jpg' % n)
except Exception as e:
print(e)
finally:
print('图片%s下载操作完成' % n)
http_response = getResponse("https://coding.imooc.com/") # 拿到http请求后的上下文对象(HTTPResponse object)
# print(http_response.read().decode('utf-8'))
data = http_response.read().decode('utf-8')
# print(data)
global n #声明全局变量
n = 1
L = getJpg(data)
for jpginfo in L:
print(jpginfo)
s = re.findall(r'//img.+?.jpg', jpginfo)
for a in s:
print('需要修改的图片路径:'+a)
url='http:'
formatS=[]
#for循环进行拼接。
for formats in s:
formatS.append(url+formats)
for b in formatS:
print('改变后的图片路径:'+b)
downLoad(formatS[0], n)
n = n + 1
运行结果如图:
再来看看文件夹中有没有:
欧耶! 爬取成功!打开图片看看 对不对
这是最简单的爬虫,但是还是蛮好玩的 哈哈哈哈哈哈~
(1)不涉及url循环遍历
(2)不涉及多线程
(3)不涉及复杂正则表达式
(4)不涉及算法
(5)不涉及数据层面的存储
(6)不涉及网络带宽
文章到此就结束了,以此来记录我起床后的无聊时光。