最近老师布置了个实验,爬取战狼二的全部影评。正好可以将正则表达式的方法归纳一下。

0x01 爬取方法

URLhttps://movie.douban.com/subject/26363254/comments?start=0&limit=20&sort=new_score&status=P

方法:正则表达式

python库:re、requests、time

数据保存:文件存储

0x02 爬取数据

查看URL迭代规律

既然是爬虫,肯定是指大量数据,而大量数据总是会分页进行展示,所以我们要确定好每次访问的url地址,就这次的url而言,笔者发现url中参数start是决定页面的切换,start=0是第一页影评的网址,而start=20则是第二页的网址,说明start是对应影评的条数,limit是每页的展示数量

这便可以确定url:

1
urls = ['https://movie.douban.com/subject/26363254/comments?start={}&limit=20&sort=new_score&status=P'.format(i) for i in range(0,10000,20)]

查看源代码格式

能够使用正则表达式的前提是我们需要获取的东西都呈现在网页源代码中,所以先查看源代码的情况。
其实可以发现,我们要的影评,用户名,时间,都在网页源代码上,这样,我们便可以选择提取数据的方法了:正则表达式。然后根据源代码构造爬取内容的正则表达式:

1
2
3
reg_comment = r'<span class="short">(.*?)</span>'
reg_name = r'<a href="https://www.douban.com/people/.*?/" class="">(.*?)</a>'
reg_time = r'<span class="comment-time " title="(.*?)">'

0x03 代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import re
import requests
import time

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
}

def getInfo(url):
res = requests.get(url,headers=headers)
if "检测到有异常请求从你的 IP 发出" in res.text:
print(res.text)
reg_comment = r'<span class="short">(.*?)</span>'
reg_name = r'<a href="https://www.douban.com/people/.*?/" class="">(.*?)</a>'
reg_time = r'<span class="comment-time " title="(.*?)">'
comments = re.findall(reg_comment,res.text)
names = re.findall(reg_name,res.text)
times = re.findall(reg_time,res.text)


with open("战狼2影评.txt",'a+',encoding='utf-8') as f:
for comment,name,time in zip(comments,names,times):
f.write("(" + name + " " + time + "):")
f.write(comment + "\n")
if __name__ == "__main__":
urls = ['https://movie.douban.com/subject/26363254/comments?start={}&limit=20&sort=new_score&status=P'.format(i) for i in range(0,10000,20)]
page = 0
for url in urls:
getInfo(url)
time.sleep(2)
page += 1
print("第{}页爬取完成...".format(page))

注意的两个问题:

  1. 在一定时间访问过多次数,会被网站后台的检测系统封IP,在爬取一页之后,需进行暂停2秒或更久:time.sleep(2)
  2. 在访问中,加入模拟浏览器访问的验证信息User-Agent,这样不容易被后台检测出是非人为访问