当前位置:   article > 正文

【网络爬虫】(3) 案例小结,文本内容爬取,附Python代码_爬虫练习文本

爬虫练习文本

本节总结一下各种文本内容爬取的方法,进行一下案例实战,附详细解析,包含:微博评论爬取;豆瓣电影信息爬取;飞卢网小说爬取;知乎问答爬取。


1. 微博评论爬取

  1. import re # 导入正则表达式模块,用于提取文本中的中文字符
  2. import requests # 导入requests模块,用于发起网络请求
  3. import pandas as pd # 导入pandas模块,用于数据处理和保存到Excel文件
  4. # 设置要爬取的微博评论页面的URL
  5. url = 'https://m.weibo.cn/comments/hotflow?id=4784937075214225&mid=4784937075214225&max_id_type=0'
  6. # 设置请求头,伪装成浏览器进行访问,避免被服务器识别为爬虫
  7. headers = {
  8. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
  9. }
  10. # 发起GET请求,获取微博评论页面的数据
  11. response = requests.get(url=url, headers=headers)
  12. # 初始化一个空列表,用于存储爬取到的评论信息
  13. lis = []
  14. # 遍历响应数据中的评论列表
  15. for index in response.json()['data']['data']:
  16. # 使用正则表达式提取评论中的中文字符,并拼接成字符串
  17. content = ''.join(re.findall('[\u4e00-\u9fa5]+', index['text']))
  18. # 构造一个字典,存储爬取到的评论信息
  19. dit = {
  20. '用户': index['user']['screen_name'], # 用户名
  21. '地区': index['source'].replace('来自', ''), # 地区,这里简单地将来源文本中的“来自”替换为空字符串
  22. '评论': content, # 评论内容
  23. '日期': index['created_at'] # 评论日期
  24. }
  25. # 将构造好的字典添加到列表中
  26. lis.append(dit)
  27. # 打印爬取到的评论信息(注:这行代码可以注释掉,仅用于调试)
  28. print(dit)
  29. # 将列表转换为pandas DataFrame,方便后续处理
  30. pd_data = pd.DataFrame(lis)
  31. # 将DataFrame保存到Excel文件中
  32. pd_data.to_excel('微博评论.xlsx')

结果展示,评论信息保存在excel中


2. 豆瓣TOP250电影信息爬取

  1. import requests # 导入requests库,用于发送网络请求
  2. import parsel # 导入parsel库,用于解析HTML或XML数据
  3. import csv # 导入csv库,用于写入CSV文件
  4. import time # 导入time库,用于控制程序运行时间或休眠
  5. # 以追加模式打开文件,用于写入豆瓣电影Top250的信息
  6. f = open('豆瓣Top250.csv', mode='a', encoding='utf-8', newline='')
  7. # 定义csv文件的列名
  8. csv_writer = csv.DictWriter(f, fieldnames=[
  9. '标题', # 电影标题
  10. '导演', # 导演
  11. '演员', # 演员
  12. '电影年份', # 电影年份
  13. '拍摄国家', # 拍摄国家
  14. '电影类型', # 电影类型
  15. '电影评分', # 电影评分
  16. '评论人数', # 评论人数
  17. '电影简介', # 电影简介
  18. ])
  19. # 写入CSV文件的列名(即表头)
  20. csv_writer.writeheader()
  21. # 初始化一个变量num,用于控制爬取的页码
  22. num = 1
  23. for page in range(0, 250, 25):
  24. print(f'正在爬取第{num}页数据内容')
  25. num += 1 # 更新页码
  26. time.sleep(1) # 暂停1s,防止更新过于频繁
  27. # 1. 发送请求, 确定url地址 然后对其发送请求
  28. url = f'https://movie.douban.com/top250?start={page}&filter='
  29. # User-Agent 浏览器的基本标识 基本信息 headers请求头 主要是把python代码进行伪装
  30. headers = {
  31. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'
  32. }
  33. response = requests.get(url=url, headers=headers) # 发送GET请求,获取响应内容
  34. selector = parsel.Selector(response.text) # 使用parsel库解析HTML内容
  35. # css选择器 主要根据标签属性内容提取数据
  36. lis = selector.css('.grid_view li') # 获取所有li标签 返回的数据 列表, 列表里面没一个元素都是selector对象
  37. for li in lis:
  38. title = li.css('.info .hd span.title:nth-child(1)::text').get() # 电影的名字
  39. movie_info_list = li.css('.bd p:nth-child(1)::text').getall() # 电影的信息
  40. # getall 返回的是列表 strip() 去除字符串左右两端空格
  41. actor_list = movie_info_list[0].strip().split('   ')
  42. if len(actor_list) > 1:
  43. actor_1 = actor_list[0].replace('导演: ', '') # 导演
  44. actor_2 = actor_list[1].replace('主演: ', '').replace('/...', '') # 主演
  45. movie_info = movie_info_list[1].strip().split(' / ')
  46. movie_year = movie_info[0] # 电影的年份
  47. movie_country = movie_info[1] # 电影的国家
  48. movie_type = movie_info[2] # 电影的类型
  49. movie_sum = li.css('.inq::text').get() # 电影简介
  50. movie_num = li.css('.rating_num::text').get() # 电影评分
  51. comment = li.css('.star span:nth-child(4)::text').get().replace('人评价', '') # 评论人数
  52. else:
  53. actor_1 = actor_list[0]
  54. actor_2 = 'None'
  55. dit = { # 将提取到的信息构造成一个字典
  56. '标题': title,
  57. '导演': actor_1,
  58. '演员': actor_2,
  59. '电影年份': movie_year,
  60. '拍摄国家': movie_country,
  61. '电影类型': movie_type,
  62. '电影评分': movie_num,
  63. '评论人数': comment,
  64. '电影简介': movie_sum,
  65. }
  66. csv_writer.writerow(dit) # 将提取到的电影信息写入CSV文件
  67. print(title, actor_1, actor_2, movie_year, movie_country, movie_type, movie_sum, movie_num, comment, sep='|')

结果展示,电影信息以CSV文件保存


3. 飞卢网小说爬取

  1. """
  2. 多页 多个数据采集, 我们要去分析, 请求url地址变化规律
  3. """
  4. import requests # 导入requests库,用于发起网络请求
  5. import parsel # 导入parsel库,用于解析HTML内容
  6. # 遍历页码,从1到43
  7. for page in range(1, 44):
  8. # 构造请求的URL,其中{page}会被循环中的page值替换
  9. url = f'https://b.faloo.com/1163585_{page}.html'
  10. # 设置请求头,伪装成浏览器访问
  11. headers = {
  12. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36'
  13. }
  14. # 发起GET请求,获取网页内容
  15. response = requests.get(url=url, headers=headers)
  16. # 使用parsel库的Selector类解析网页内容
  17. selector = parsel.Selector(response.text)
  18. # 使用CSS选择器提取小说的标题
  19. title = selector.css('.c_l_title h1::text').get().replace('偷吃我外卖被辣哭,问我要索赔? ', '')
  20. # 去掉标题中不需要的文字
  21. # 使用CSS选择器提取小说的所有段落内容
  22. content_list = selector.css('div.noveContent p::text').getall()
  23. # 将所有段落内容合并成一段长文本
  24. content = '\n'.join(content_list)
  25. # 打印提取到的小说标题和内容
  26. print(title)
  27. print(content)
  28. # 将标题和内容写入到本地文件中
  29. with open('偷吃我外卖被辣哭,问我要索赔?' + '.txt', mode='a', encoding='utf-8') as f:
  30. # 写入标题
  31. f.write(title)
  32. # 换行
  33. f.write('\n')
  34. # 写入内容
  35. f.write(content)
  36. # 再次换行,为了区分不同章节
  37. f.write('\n')

结果展示,小说文本以txt格式保存


4. 知乎回答爬取

  1. import requests # 导入数据请求模块
  2. import re # 导入正则
  3. import json # 导入json
  4. # 请求链接
  5. url = 'https://www.zhihu.com/question/584206512'
  6. # 伪装浏览器
  7. headers = {
  8. 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
  9. }
  10. # 发送GET请求到知乎的问题页面
  11. response = requests.get(url=url, headers=headers)
  12. # 问题标题
  13. title = re.findall('<title data-rh="true">(.*?)</title>', response.text)[0] # 使用正则表达式从返回的HTML中查找问题标题
  14. # 答案内容
  15. html_data = re.findall('<script id="js-initialData" type="text/json">(.*?)</script', response.text)[0] # 使用正则表达式查找包含答案内容的JSON字符串
  16. # 字符串转成字典
  17. json_data = json.loads(html_data) # 将JSON字符串解析为Python字典
  18. json_dict = json_data['initialState']['entities']['answers'] # 定位到答案所在的JSON字典部分
  19. for i in json_dict.keys():
  20. # 答案内容
  21. content = json_dict[i]['excerpt']
  22. # 答题者用户名
  23. name = json_dict[i]['author']['name']
  24. with open(title + '.txt', mode='a', encoding='utf-8')as f: # 以追加模式打开文件(如果文件不存在则创建),将答案内容写入文件
  25. f.write(f'网友 "{name}" 回答: {content}\n')
  26. print(content)

结果展示,文件名是问题,内容是回答,以txt保存

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/838377
推荐阅读
相关标签
  

闽ICP备14008679号