学习了一个小爬虫,能在豆瓣上抓取特定的信息抓取并存储起来,他实现的原理如下
- 首先通过openurl对网站进行解析,将其转换成字符串类型
- 利用目标字符的特性用函数进行抓取信息,这里利用find2(s1, s2):返回字符串s2在字符串s1中的下标,find_between(s, left, right):返回在s字符串中left和right中间的字符串
- 爬虫的原理(猜测):将网站的信息转换为字符串形式,然后通过对字符信息的检索来达到抓取数据的目的
实现代码:(这里实现的是抓取25部电影的评分)
import urllib.request
def log(*args, **kwargs):
print(*args, **kwargs)
# 如果s2是s1的子字符串,那么返回s2在s1中的下标,否则返回-1
def find2(s1, s2):
result = -1
for i in range(len(s1)):
if s1[i:i + len(s2)] == s2:
result = i
break
return result
# 返回字符串left和字符串right在s字符串中之间的字符串,这个函数只返回第一队left和right
def find_between(s, left, right):
result = ''
subscript1 = find2(s, left)
subscript2 = find2(s, right)
for i in range(subscript1+len(left), subscript2):
result = result + s[i]
return result
def openurl(url):
# 这里把 url 写死为豆瓣 top250 页面
# url = 'https://movie.douban.com/top250'
# 下载页面, 得到的是一个 bytes 类型的变量 s
s = urllib.request.urlopen(url).read()
# 用 utf-8 编码把 s 转为字符串并返回
content = s.decode('utf-8')
return content
def ratings():
grade = []
str = openurl('https://movie.douban.com/top250')
left = 'property="v:average">'
right = '</span>'
for i in range(25):
m = find2(str, left)
# 第一次分片是为了减少find_between(str, left, right)的遍历次数
str = str[m:]
grade.append(find_between(str, left, right))
# 将上一对left、right通过分片消除
str = str[len(left):]
return grade
def __main():
array = ratings()
m = 0
for i in array:
log('第{}个数据是:{}'.format(m, i))
m += 1
__main()