python3爬虫初步之正则表达式实战
**
爬虫初步之正则表达式实战
**
关于正则表达式的介绍及用法读者可以去百度,这里就不再赘述了,默认大家已经了解过正则表达式了,下面直接开始实战。
利用requests以及正则表达式爬取豆瓣电影Top250
一、访问目标网址并找出网址规律
豆瓣电影Top250的网址是:https://movie.douban.com/top250,点进去以后部分网页内容如下:
我们只能看到第一页的数据,只包含25条,而网页总共有10页包含250条信息,我们再点击第二页,发现网页的URL发生了变化,如下图:
比首页多出了start=25(&以及以后的可以忽略),我们再点击第三页,发现start=后面的值变成了50,以此类推,后一页比前一页多加25,那么第一页应该就是0,所以,第一页完整的网址应该是https://movie.douban.com/top250?start=0,总共有10页,也就是累加9次。
那么URL的规律用代码就可以实现了,具体如下:
'''
250个电影,一页显示25个,总共10页,即url地址start=后累加9次
'''
# 添加浏览器用户代理
# hearders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
# "Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0"
# }
url = "https://movie.douban.com/top250?start=" # 豆瓣top250网址,strart=后面加页数,比如第一页就是0,第二页是25,每次累加25
rules = r'<div class="hd">([\d\D]*)</li>' # 正则表达式匹配电影信息
for i in range(10):
whole_url = url + str(i*25)
print(whole_url)
二、提取想要的信息
使用Chrome浏览器访问目标网址,按F12查看网页源码,点击下图所示小箭头后再点击网页上想获取的信息,就能看到目标信息所对应的标签
我们所需的电影信息如下图:
是在
标签下,信息定位wanbi完毕,接下来就该用正则表达式将信息提取出来了,代码如下:
rules = r'<div class="hd">([\d\D]*)</li>' # 正则表达式匹配电影信息
def match(rule, html):
'''
利用正则表达式从源代码中匹配想要获取的内容
'''
result = re.findall(rule,html)
return result
最后将获取的信息存入文件,获取的文件比较杂乱
现在是初学阶段,关于数据的清洗和入库以后再谈。
附源码:
import requests # 导入requests库
import re # 导入正则表达式
import time
def loadPage(url):
'''
访问目标地址,并返回网页源代码
'''
response = requests.get(url=url).content # 访问目标网址
response = str(response, 'utf-8')
return response
def match(rule, html):
'''
利用正则表达式从源代码中匹配想要获取的内容
'''
result = re.findall(rule,html)
return result
def dataSave(datas):
'''
将获得的数据写入txt文档
'''
for data in datas:
with open("豆瓣Top250.txt", 'a', encoding='utf-8') as f:
f.write(data)
def main():
'''
250个电影,一页显示25个,总共10页,即url地址start=后累加9次
'''
# 添加浏览器用户代理
# hearders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
# "Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0"
# }
url = "https://movie.douban.com/top250?start=" # 豆瓣top250网址,strart=后面加页数,比如第一页就是0,第二页是25,每次累加25
rules = r'<div class="hd">([\d\D]*)</li>' # 正则表达式匹配电影信息
for i in range(10):
whole_url = url + str(i*25)
print("正在获取第%d页" %(i+1))
content = loadPage(whole_url) # 获取每一页的内容
datas = match(rules, content) # 获取电影内容
dataSave(datas) # 将数据写入文件
time.sleep(3) # 每获取一页等3s后再获取下一页
if __name__ == '__main__':
main()