一、分析目标URL
豆瓣电影Top250首页URL:
点击下一页查看URL变为:
再次点击下一页:
由此分析出URL有两个参数:start,filter,每过一页参数start+25,而参数filter一直为空!
二、使用步骤
1.引入库
首先需要导入requests库和re库 (没下载的需要pip insatall requests)
代码如下(示例):
import re
import requests
2.得到需要爬取的10个URL
我将它封装成了函数
def URL_list(): # 构建URL列表
urls = []
# 根据URL的规律进行构建
for k in range(0, 250, 25):
url = "https://movie.douban.com/top250?start=' + str(k) + '&filter="
urls.append(url)
return urls # 返回含有十个URL的列表
3.爬取页面源代码并解析
# 正则匹配,这里主要爬取电影名,上映年份,评分和评价人数
obj = re.compile(r'<li>.*?<div class="item">.*?<span class="title">(?P<name>.*?)'
r'</span>.*?<p class="">.*?<br>(?P<year>.*?) '
r'.*?<span class="rating_num" property="v:average">(?P<score>.*?)'
r'</span>.*?<span>(?P<num>.*?)</span>', re.S)
urls = URL_list() # 得到目标url列表
data = [] # 用来存放解析后的数据
headers = {
"user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Mobile Safari/537.36"
}
for url in urls:
response = requests.get(url, headers=headers)
content = response.text # 页面源代码
it = obj.finditer(content)
for item in it:
data.append(item.group('name'))
data.append(' ')
data.append(item.group('year').strip())
data.append(' ')
data.append(item.group('score'))
data.append(' ')
data.append(item.group('num'))
data.append('\n')
response.close()
# print(data)
print('爬虫完成!')
# 再将结果写入txt文件
with open('豆瓣top250.txt', 'w', encoding='utf-8')as f:
for i in data:
f.write(i)
print('成功存入文件!')
4.源代码
# coding:utf-8
import re
import requests
# 爬取豆瓣电影 Top 250
"""
1.拿到页面源代码
2.通过re提取想要的信息
"""
# url = "https://movie.douban.com/top250?start=xxx&filter="
def URL_list(): # 构建URL列表
urls = []
# 根据URL的规律进行构建
for k in range(0, 250, 25):
url = "https://movie.douban.com/top250?start=' + str(k) + '&filter="
urls.append(url)
return urls # 返回含有十个URL的列表
if __name__ == '__main__':
# 正则匹配
obj = re.compile(r'<li>.*?<div class="item">.*?<span class="title">(?P<name>.*?)'
r'</span>.*?<p class="">.*?<br>(?P<year>.*?) '
r'.*?<span class="rating_num" property="v:average">(?P<score>.*?)'
r'</span>.*?<span>(?P<num>.*?)</span>', re.S)
urls = URL_list() # 得到目标url列表
data = [] # 用来存放解析后的数据
headers = {
"user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Mobile Safari/537.36"
}
for url in urls:
response = requests.get(url, headers=headers)
content = response.text # 页面源代码
it = obj.finditer(content)
for item in it:
data.append(item.group('name'))
data.append(' ')
data.append(item.group('year').strip())
data.append(' ')
data.append(item.group('score'))
data.append(' ')
data.append(item.group('num'))
data.append('\n')
response.close()
# print(data)
print('爬虫完成!')
# 再将结果写入txt文件
with open('豆瓣top250.txt', 'w', encoding='utf-8')as f:
for i in data:
f.write(i)
print('成功存入文件!')
5.爬虫成果
总结:
总的来说这只是个demo,还有许多需要改进的地方,比如可以将数据存入exel文件或者csv文件,也可以把爬取过程封装成一个函数,优化正则或者优化数据的格式等等。