前言
最近搞各种期末作业,决定把作业的实现思路写一下,代码放GitHub(懂的都懂)。本篇文章默认你已经有了Python,Springboot和Vue的基础了。
项目地址 | 连接 |
---|
一、Python爬虫
简述一样爬虫的原理:我们在点开一个网页时,其实也是在向别人的服务器发请求,浏览器获取的前端代码后,解析,再展示。Python爬虫,就是用代码模拟浏览器,将获得到得前端代码进行解析,获取到网页代码中有用的信息,保存到自己的数据库,Excel表格等。Python也提供了很多种爬虫框架,例如Scrapy,BeautifulSoup 等。本次作业使用的是BeautifulSoup 。BeautifulSoup 需要写一些正则表达式。下面我们来看看如何实现:
- 打开豆瓣电影Top250网页,审查元素:
可以发现每一个电影的标题都是
<span class="title">电影标题</span>
这样一种形式,于是我们就可以用正则表达式:
# 片名
findTitle = re.compile(r'<span class="title">(.+)</span>')
这样一种形式去解析正则表达式的语法可以参考[连接],简单解释一下()表示标记一个子表达式的开始和结束位置,. 匹配除换行符 \n 之外的任何单字符,+表示匹配前面的子表达式一次或多次,这样我们就可以去匹配span里任意长度的字符了。
同样的原理,我们还可以去匹配其他信息,那么,下面看一下我主要匹配了那些信息:
findLink = re.compile(r'<a href="(.*?)">') # 创建正则表达式对象,表示规则(字符串的模式) #影片连接的规则
# 影片图片的连接
findImgSrc = re.compile(r'img.*src="(.*?)"', re.S) # //re.S 忽略换行符
# 片名
findTitle = re.compile(r'<span class="title">(.+)</span>')
# 影片评分
findRating = re.compile(r'span class="rating_num" property="v:average">(.*)</span>')
# 评价人数
findJudge = re.compile(r'(\d*)人评价')
# 找到
# 找到影片的相关内容
findBd = re.compile(r'<p class="">(.*?)</p>', re.S)
- 发送请求:
我们看一下刚才进入的网页:
首页start=0,当翻到第二页时,start=25
简单的推理就是这个网页一页展示25个编号从0 开始 ,翻页就改变连接中start的内容就好,第二页start=25,第三页start=50,以此类推。
于是就开始模拟浏览器请求网页了:
# 得到指定一个网页的信息
def askURL(url):
# 用户代理表示告诉服务器 我是什么类型的
head = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36 Edg/85.0.564.68"} #这个内容一定要添加,不然别人会认为你是一个爬虫
req = urllib.request.Request(url, headers=head)
html = ""
try:
response = urllib.request.urlopen(req)
html = response.read().decode("utf-8")
except urllib.error.URLError as e:
if hasattr(e, "code"):
print(e, "code")
if hasattr(e, "reason"):
print(e, "reason")
return html
- 解析
得到html代码后就根据,就根据上面定义好的正则表达式开始解析:
def getData(baseurl):
dataList = []
for i in range(0, 10): # 调用获取信息的函数
url = baseurl + str(i * 25)
html = askURL(url) # 保存获取到的网页源码
# print(html)
# 解析网页~
soup <