简介: 这是一个很简单的获取豆瓣网文本内容的爬虫,涉及到requests模块get方法的使用,正则表达式re模块的对数据进行抽取,得到我们关注的内容(电影名,影片上映时间,评分,评论人数),最后保存到csv文件中
前期准备
python模块: re模块,requests模块,csv模块
豆瓣电影top250地址:https://movie.douban.com/top250
请求数据
1、使用requests模块的get()方法获取网页源码。
# 请求头
import requests
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
}
#resp接收get请求响应的数据
resp=requests.get("https://movie.douban.com/top250",headers=headers)
#text查看响应的内容
print(resp.text)
resp.close()
使用requests获取的网页源码(开头)
网页开发者模式看到的源码(开头)
注意:
-
为什么get()需要headers参数:模拟网站的正常访问,绕开反爬机制
-
headers如何找到:F12,开发者工具。requests下
-
resp.close():关闭你的请求,如果你不关掉你的请求,时间长了或者多次执行代码后就会限制访问这个网页(亲测)
数据处理
2、使用正则表达式,对筛选我们需要的内容
#预加载
import requests
import re
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
}
reStr=re.compile(
r'<li>.*?<em class="">(?P<topnum>.*?)</em>.*?' # top榜排名
r'<span class="title">(?P<name>.*?)</span>.*?' # 电影名
r'.*?<br>(?P<year>.*?) ' # 上映年份
r'.*?<span class="rating_num" property="v:average">(?P<score>.*?)</span>.*?<span>(?P<nums>.*?)人评价</span>' # 评论人数
,re.S)
resp=requests.get("https://movie.douban.com/top250",headers=headers)
obj=resp.text
res = reStr.finditer(obj) # finditer匹配整个语句,并返回一个迭代器
for i in res:
print(i.group('topnum')) # 打印我们需要的分组
print(i.group('name'))
print(i.group('year').strip()) # strip处理空格
print(i.group('score'))
print(i.group('nums'))
resp.close()
运行截图(我们获取了一个页面的内容,共25条数据):
完整的250条数据:
通过分析网址发现仅start的参数有变化:
(第一页)https://movie.douban.com/top250?start=&filter=
(第二页)https://movie.douban.com/top250?start=25&filter=
所以我们通过循环遍历的方式,去改变url,达到获取整个top榜的数据
import requests
import re
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
}
reStr=re.compile(
r'<li>.*?<em class="">(?P<topnum>.*?)</em>.*?' # top榜排名
r'<span class="title">(?P<name>.*?)</span>.*?' # 电影名
r'.*?<br>(?P<year>.*?) ' # 上映年份
r'.*?<span class="rating_num" property="v:average">(?P<score>.*?)</span>.*?<span>(?P<nums>.*?)人评价</span>' # 评论人数
,re.S)
# 新增的for循环遍历改变网址
for it in range(0,250,25):
url = "https://movie.douban.com/top250?start={}".format(it)
# 未改变
resp=requests.get(url,headers=headers)
obj=resp.text
res = reStr.finditer(obj) # finditer匹配整个语句,并返回一个迭代器
for i in res:
print(i.group('topnum'),end=" ")
print(i.group('name'),end=" ")
print(i.group('year').strip(),end=" ")
print(i.group('score'),end=" ")
print(i.group('nums'))
resp.close()
运行截图(部分)
保存数据
3、把内容保存到csv文件中
import csv
# 新建文件,不使用encoding,windows用户保存的文件容易出现乱码的情况
f=open("topdata.csv",mode="w",encoding="utf-8")
csvwriter=csv.writer(f)
for it in range(0,250,25):
url = "https://movie.douban.com/top250?start={}".format(it)
resp=requests.get(url,headers=headers)
obj=resp.text
res = reStr.finditer(obj) # finditer匹配整个语句,并返回一个迭代器F
for i in res:
# print(i.group('topnum'),end=" ")
# print(i.group('name'),end=" ")
# print(i.group('year').strip(),end=" ")
# print(i.group('score'),end=" ")
# print(i.group('nums'))
#遍历写入数据
dict = i.groupdict()
dict['year'] = dict['year'].strip()
csvwriter.writerow(dict.values())
成功保存截图:
完整代码:
import requests
import re
import csv
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
}
reStr=re.compile(
r'<li>.*?<em class="">(?P<topnum>.*?)</em>.*?' # top榜排名
r'<span class="title">(?P<name>.*?)</span>.*?' # 电影名
r'.*?<br>(?P<year>.*?) ' # 上映年份
r'.*?<span class="rating_num" property="v:average">(?P<score>.*?)</span>.*?<span>(?P<nums>.*?)人评价</span>' # 评论人数
,re.S)
# 新建文件,不使用encoding,windows用户保存的文件容易出现乱码的情况
f=open("topdata.csv",mode="w",encoding="utf-8")
csvwriter=csv.writer(f)
for it in range(0,250,25):
url = "https://movie.douban.com/top250?start={}".format(it)
resp=requests.get(url,headers=headers)
obj=resp.text
res = reStr.finditer(obj) # finditer匹配整个语句,并返回一个迭代器F
for i in res:
# print(i.group('topnum'),end=" ")
# print(i.group('name'),end=" ")
# print(i.group('year').strip(),end=" ")
# print(i.group('score'),end=" ")
# print(i.group('nums'))
#遍历写入数据
dict = i.groupdict()
dict['year'] = dict['year'].strip()
csvwriter.writerow(dict.values())
resp.close()
# 操作完文件后就关闭,养成好习惯
f.close()
print("over")
这就是一个完整的简单的爬虫实例,可以去试一试了!