一、爬虫爬取网站流程
1、分析网站的数据来源
分析网站结构,待爬取数据在哪。
2、查看页面数据能否通过requests模块获取到
(1)在开发者工具中,找到页面的url对应的请求。通过这条请求的信息来进行程序的书写。
(2)在代码中通过requests模块封装请求头,查看response.text中是否有页面数据。
3、如果有数据,就考虑是否有分页,分页如何实现
4、实现分页之后就可以提取数据,保存数据了
二、爬取猫眼电影实例
下面以爬取猫眼电影的电影信息为例,运用正则,介绍爬取网页的详细流程
1、定义爬取网页数据的主函数
确定基础url,封装请求头,确定爬取页数。
import requests,re,json
# 主函数,爬取网页
def main():
base_url = 'https://maoyan.com/board/4?offset=%s' # 先在这里将分页的格式写好
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
'Referer': 'https://maoyan.com/board/',
# 为确保请求成功,最好加上cookie
}
for i in range(10): # 爬取前十页
response = requests.get(base_url%(i*10),headers=headers)
# print(response.text) # 测试
parse_page(response.text) # 调用读取、筛选数据函数
2、定义获取、过滤数据的函数
用正则匹配原则:不断搜小匹配范围,最后做到精确匹配,得到想要的数据。
movies = [] # 定义列表,将字典存储在列表中
# 过滤、筛选数据
def parse_page(html_str):
# (.*?) 非贪婪模式下匹配任意字符 , re.S 将换行符 '\n' 变成字符串
dd_p = re.compile(r'<dd>(.*?) </dd>',re.S) # 非贪婪匹配
dd_lst = dd_p.findall(html_str) # 调用findall方法,得到列表页面
for dd in dd_lst: # 获得每一个电影的字符串格式数据
# 电影名称
title_p = re.compile(r'title="(.*?)" class',re.S)
title = title_p.search(dd).group(1)
# 主演
actors_p = re.compile(r'"star">(.*?)</p>',re.S)
actors = actors_p.search(dd).group(1).strip() # strip() 去除空格
# 评分
score_p = re.compile(r'integer">(.*?)</i><i class="fraction">(.*?)</i>')
score_lst = score_p.findall(dd)
# print(score_lst) # [('9.', '5')] 多个分组时,会以元组的形式添加到列表中
score = ''.join(score_lst[0])
# 定义字典,保存每一部电影信息
item = {}
item['title'] = title
item['actors'] = actors
item['score'] = score
movies.append(item) # 将字典存储在列表中
3、保存数据
调用json模块的 **json.dump()**方法,保存数据。
def write_to_file(filename,lst): # 需要传两个参数
with open(filename,'w',encoding='utf-8')as f:
json.dump(lst,f)
以上函数定义好,接下来执行函数,爬取网页信息。
if __name__ == '__main__':
main() # 执行主函数,爬取网页
write_to_file('moves.json', movies) # 执行保存函数
4、读取数据
从保存的json数据中,调用 json.load()方法,读取数据。
# 从json文件中读取数据
move_list = json.load(open('moves.json','r'))
print(move_list)