爬虫学习(二)
正则表达式
概念
用来检索、替换那些符合某个模式(规则)的文本
爬虫主要思路
- 先用正则语法定义一个规则
- 使用这个规则和网页进行对比,根据规则提取内容。
正则表达式例子
例如:一个字符串中包含一个邮箱[email protected]
pattern:\w+@\w+\.com \w+@(\w+\.)?\w+\.com
re模块核心函数
compile()函数
- 作用:返回一个正则表达式对象
match()函数
- 作用:从字符串的最开始和pattern进行匹配,匹配成功返回匹配对象,否则返回None
爬取图片简单例子
strp()
:去除字符串两边的空格
urlretrieve
方法
从远端下载文件内容,源码如下:
def urlretrieve(url, filename=None, reporthook=None, data=None):
# url:远端文件地址
# filename:本地文件的地址
# reportbook:我们可以利用这个回调函数来显示当前的下载进度
# data: 指 post 到服务器的数据
re.findall
方法
返回string中所有与pattern相匹配的全部字串,返回形式为数组
def findall(pattern, string, flags=0):
文件解码
import chardet
result = getHtml("http://pic.yxdown.com/list/0_74_1.html#")
encode_type = chardet.detect(result)
result = result.decode(encode_type['encoding']) # 进行相应解码,赋给原标识符(变量
- 完整的Demo
import urllib.request
import re
import urllib
import chardet # 需要导入这个模块,检测编码格式
得到网页内容
def getHtml(url):
print("请求网页内容开始==================")
try:
print("爬取的网站地址为==============" + url)
html = urllib.request.urlopen(url)
result = html.read()
except urllib.error.HTTPError as e:
if hasattr(e, 'reason'):
print('错误原因是' + str(e.reason))
except urllib.error.URLError as e:
if hasattr(e, 'code'):
print('错误状态吗是' + str(e.code))
else:
print('请求成功!')
return result
print("请求网页内容结束======================")
# 进行内容解码不然会报错
result = getHtml("http://pic.yxdown.com/list/0_74_1.html#")
encode_type = chardet.detect(result)
result = result.decode(encode_type['encoding']) # 进行相应解码,赋给原标识符(变量
# 展示下载的进度
def cbk(a, b, c):
'''''回调函数
@a:已经下载的数据块
@b:数据块的大小
@c:远程文件的大小
'''
per = 100.0 * a * b / c
if per > 100:
per = 100
print("下载进度为=======================" + '%.2f%%' % per)
# 下载文件中的图片
def getImage(html):
print("下载图片开始====================")
reg = 'src="(http:.+?\.jpg)" alt='
cp = re.compile(reg)
print(cp)
# print(html)
images = re.findall(reg, html)
x = 0
for img in images:
print(x)
urllib.request.urlretrieve(img, './images/%s.jpg' % x, cbk)
x += 1
return images
print("下载图片结束====================")
# 将结果保存到txt中
# 处理保存的文本文件的格式
def clearBlank(result_content):
print("处理文本信息开始======================")
with open('./one.txt', 'wb') as f:
# 将内容保存到txt中
f.write(result_content)
print("保存文件完成==================")
# 创建文件操作流对象
file1 = open('./one.txt', 'r', encoding='utf-8')
file2 = open('./two.txt', 'w', encoding='utf-8')
try:
for line in file1.readlines():
if line == '\n':
line = line.strip("\n")
file2.write(line)
finally:
f.close()
file1.close()
file2.close()
print("处理文本信息结束=======================")
if __name__ == '__main__':
getImage(result)
clearBlank(getHtml("http://pic.yxdown.com/list/0_74_1.html#"))