当前位置: 首页 > article >正文

【第二十一周】网络爬虫实践

目录

  • 摘要
  • Abstract
  • 案例:使用 Python 抓取微博评论数据
  • 一、数据来源分析
    • 1.明确需求
    • 2.抓包分析
  • 二、代码实现步骤
    • 1.发送请求
    • 2.获取数据
    • 3.解析数据
    • 4.保存数据
    • 5.批量采集数据
    • 6.封装函数
  • 总结

摘要

本周主要完成了陶博的大语言课程中布置的一个爬虫实践任务,为了加深记忆从而把这周自学到的内容都总结为周报。网络爬虫(web crawler)是一种自动化程序,用于在互联网上自动抓取和收集信息。‌ 它通过模拟人类用户的行为,按照一定的规则和算法,自动访问网页并提取所需的数据。网络爬虫通常从一个或多个初始网页的URL开始,然后根据预设的规则递归地访问其他网页,抓取其中的信息。‌爬虫和大语言模型(如GPT系列、BERT等)之间存在密切的关系,主要体现在数据收集和训练两个方面。爬虫为大语言模型提供了丰富的训练数据,而大语言模型则利用这些数据进行各种高级任务,两者相辅相成,共同推动了自然语言处理技术的发展。

Abstract

This week, I mainly completed a web crawling practice task assigned in Dr. Tao’s large language model course. To reinforce my memory, I summarized all the content I self-studied this week into a weekly report. A web crawler is an automated program used to automatically fetch and collect information from the internet. It simulates human user behavior, visiting web pages according to certain rules and algorithms, and extracting the required data. Web crawlers typically start from one or more initial webpage URLs, then recursively visit other web pages based on predefined rules, and fetch the information contained within them. There is a close relationship between web crawlers and large language models (such as the GPT series and BERT), primarily in terms of data collection and training. Web crawlers provide rich training data for large language models, which in turn use this data to perform various advanced tasks. The two complement each other and together drive the development of natural language processing technology.

案例:使用 Python 抓取微博评论数据

实践环节基于B站视频:Python爬取微博评论数据

在这里插入图片描述

微博是一个活跃的社交媒体平台,每天有大量的用户发布评论、帖子和互动内容。这些用户生成的内容提供了丰富的文本数据,可以用于训练大语言模型。并且,微博用户来自不同的背景和地区,他们的评论涵盖了各种话题和领域,这使得数据具有高度的多样性代表性

那么我们要如何进行爬虫呢?

网络爬虫实际上分为以下几个步骤,只要按照步骤去分析,我们就可以解决绝大多数问题。

一、数据来源分析

1.明确需求

在这里插入图片描述

这一步主要是为了明确采集的网站以及数据内容,例如我们要采集杨紫这条微博下的评论数据。
网址:https://weibo.com/1227368500/OFCwW79Nv#comment

2.抓包分析

抓包分析(Packet Analysis)是指通过捕获和分析网络通信中的数据包来了解网络流量、诊断网络问题、检测安全漏洞等的技术手段。抓包工具可以捕获网络接口上传输的所有数据包,并提供详细的分析功能,帮助用户深入理解网络通信的细节。

首先我们按 F12 打开开发者工具,然后选择 network ,可以看到如下画面:

在这里插入图片描述

我们可以看到当前只有10个请求,此时显示的数据是不全的,要想显示整个网站的内容,我们可以先清空然后再重新刷新一遍网址。

在这里插入图片描述

此时直接显示出来了149个请求,并且还在慢慢增加。

接下来我们再进行关键字搜索

在这里插入图片描述
我们点击上面的搜索按钮,然后将评论信息复制到搜索框中进行搜索,可以看到搜索出来了相应的包。

在这里插入图片描述
点进去到 response(响应)界面就可以看到相应的信息,比如评论、用户地区和昵称等。

在这里插入图片描述
再点击这个包的 headers(标头),就可以看到这个数据包的请求地址了。

数据包地址:https://weibo.com/ajax/statuses/buildComments?is_reload=1&id=5099195621705961&is_show_bulletin=2&is_mix=0&count=10&uid=1227368500&fetch_level=0&locale=zh-CN

找到数据包地址我们就可以开始进入代码实践环节了。

二、代码实现步骤

1.发送请求

这部分实际上是用代码模拟浏览器对 URL 地址发送请求,我们可以到 headers 部分寻找我们模拟浏览器想要的参数内容,比如 cookie 和 UA。
在这里插入图片描述在这里插入图片描述

这两部分我们可以使用一个字典来接受:

# 模拟浏览器
headers = {
        #cookie 用户信息,常用于检测是否有登陆账号
        'cookie':'',
        #user-agent 用户代理,表示浏览器/设备基本身份信息
        'user-agent':''
    }

然后将我们刚刚获得的数据包地址粘贴下来,得到:

# 请求网址
    url = 'https://weibo.com/ajax/statuses/buildComments?is_reload=1&id=5099195621705961&is_show_bulletin=2&is_mix=0&count=10&uid=1227368500&fetch_level=0&locale=zh-CN'

接下来我们使用第三方模块 requests 去发送请求。

# 导入 requests 模块
import requests

# 发送请求
response = requests.get(url=url,headers=headers)

数据包地址中最后的问号之后其实是携带的各种参数,我们可以在 payload(载荷)部分看到它们。
在这里插入图片描述
因此我们还有第二种进行请求的办法,也就是将参数写到外面进行分段请求。

参数构成的字典:

#查询参数
    data = {
        'is_reload': '1',
        'id':'5099195621705961',
        'is_show_bulletin': '2',
        'is_mix': '0',
        'count': '10',
        'type': 'feed',
        'uid': '1227368500',
        'fetch_level': '0',
        'locale': 'zh-CN'
    }

2.获取数据

获取服务器返回响应数据内容

#获取响应的json数据
    json_data = response.json()
    print(json_data)

我们运行看看是否得到我们想要的数据:

在这里插入图片描述
可以看到已经取得了相应的内容了,接下来只需要从里面提取我们想要的内容就好了。

3.解析数据

提取我们需要的数据内容

#字典取值,提取评论信息所在列表
data_list = json_data['data']
# 遍历列表里面元素
for index in data_list:
        print(index)

我们可以看下结果:
在这里插入图片描述
可以看到只显示了五条结果,但是我们在前面的 preview 里明明看到有20条 data 数据,这是为什么呢?
在这里插入图片描述
我尝试了一下把之前参数中的 type 值改成 all 也就是令'type': 'all'之后得到如下结果:

在这里插入图片描述
结果正常获取20条数据,因此可以猜测 feed 可能代表着只获取前五条数据,而把 type 注释掉或者改成 all 会自动获取全部20条数据。

我们再进行细化,只提取我们想要的信息:

for index in data_list:
        # 提取具体数据内容,保存字典中
        dit = {
                '昵称': index['user']['screen_name'],
                '地区': index['source'].replace('来自', ''),
                '评论': index['text_raw']
        }
        print(dit)

可以看到我们想要的信息都能正常提取出来了:

在这里插入图片描述

4.保存数据

把数据保存到表格文件中

#创建文件对象
 f = open('data.csv', mode='a', encoding='utf-8-sig',newline='')

# 字典写入方法
csv_writer = csv.DictWriter(f,fieldnames=['昵称','地区','评论'])

# 写入表头
csv_writer.writeheader()
 

我们将写入语句csv_writer.writerow(dit)加入上一个循环中,我们可以看到数据正常保存了:

在这里插入图片描述

5.批量采集数据

在这里插入图片描述
为了批量采集数据,我们需要分析各个包的参数变化。我们可以先用标头的数据过滤一下各个包,用上面的 filter 进行搜索。注意,不是左边的搜索栏。

在这里插入图片描述
过滤之后可以看到一个包,我们将评论区往下滑动,可以看到越来越多的包刷新出来。

在这里插入图片描述

观察这连续的三个包,我们可以找到他们之间发生的规律:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过上图我们可以看到,第一个包的 count 为10,后面均为20。对于这个现象我们有两个解决方案:第一个是我们可以试着将初始的参数改为20,看看能不能获得数据,如果可以的话那么全部都改成 20 就好;第二个是采集第一页的时候用 10,采集后面的页面的话统一用 20。

经过代码测试可以发现,初始参数设为 20 时也能获得数据。根据“奥卡姆剃刀原理”——「如无必要,勿增实体」,我们直接将初始参数设为 20 即可。

再观察我们可以发现除了第一个包的 max_id 是0之外,其他的 max_id 都是一串毫无规律的数字。通常这种情况我们可以在上一个包的数据里找到下一个包所需的参数。

在这里插入图片描述
我们可以发现第一个包携带的 max_id 正好是第二个包的 max_id

我们可以声明一个变量来保存每个包携带的 max_id,并且把max_id的初始值设为0:

max_id = json_data['max_id']

6.封装函数

#导入数据请求模块
import requests

#导入csv模块
import csv

# 反封号机制
import time
import random

# 微博反爬机制是基于IP的,同一IP爬取太多数据会被ban掉导致爬不到数据
# 因此我们需要用到一些在线代理商的IP池,每次请求一次数据都要更换一次IP
# 这里使用的是快代理(有12小时免费试用)
# 以下的隧道、用户名和密码都是虚构的,自己替换一下

# 隧道域名:端口号
tunnel = "xxxx.kdltpspro.com:15818"  

# 用户名密码方式
username = "xxxx"
password = "xxxx"
proxies = {
    "http": "http://%(user)s:%(pwd)s@%(proxy)s/" % {"user": username, "pwd": password, "proxy": tunnel},
    "https": "http://%(user)s:%(pwd)s@%(proxy)s/" % {"user": username, "pwd": password, "proxy": tunnel}
}

# 要访问的目标网页
target_url = "https://dev.kdlapi.com/testproxy"

# 使用代理IP发送请求,测试是否连接上代理服务器
response = requests.get(target_url, proxies=proxies)

# 获取页面内容
if response.status_code == 200:
    print(response.text)




# User-Agent 列表,提供随机 User-Agent,每次请求数据会自动切换一次 UA
USER_AGENT_LIST = [
    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
    "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
    "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
    "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
    "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
    "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
    "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
    "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
    "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
    "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5",
    "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20",
    "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER",
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)",
    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 LBBROWSER",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)",
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)",
    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; 360SE)",
    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)",
    "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1",
    "Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5",
    "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b13pre) Gecko/20110307 Firefox/4.0b13pre",
    "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:16.0) Gecko/20100101 Firefox/16.0",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11",
    "Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36",
    "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
    "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
    "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0",
    "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; rv:11.0) like Gecko",
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
    "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
    "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
    "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11",
    "Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)",
    "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
    "Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
    "Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
    "Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
    "MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
    "Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/build-1107180945; U; en-GB) Presto/2.8.149 Version/11.10",
    "Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
    "Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en) AppleWebKit/534.1+ (KHTML, like Gecko) Version/6.0.0.337 Mobile Safari/534.1+",
    "Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.0; U; en-US) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/233.70 Safari/534.6 TouchPad/1.0",
    "Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/20.0.019; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.1.18124",
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Titan)",
    "UCWEB7.0.2.37/28/999",
    "NOKIA5700/ UCWEB7.0.2.37/28/999",
    "Openwave/ UCWEB7.0.2.37/28/999",
    "Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/999",
]

def GetContent(MaxId):
    #创建文件对象
    f = open('data3.csv', mode='a', encoding='utf-8-sig',newline='')

    #字典写入方法
    csv_writer = csv.DictWriter(f,fieldnames=['昵称','地区','评论'])
    #写入表头
    #csv_writer.writeheader()
    #客户端向服务器发送请求的表头
    headers = {
        #cookie 用户信息,常用于检测是否有登陆账号
        'cookie':'xxxx',  # 自己替换自己的cookie,我用自己的cookie可以一直提取
        #user-agent 用户代理,表示浏览器/设备基本身份信息
        'user-agent':random.choice(USER_AGENT_LIST)
    }

    #请求网址
    #url = 'https://weibo.com/ajax/statuses/buildComments?is_reload=1&id=5096395729802504&is_show_bulletin=2&is_mix=0&count=20&type=feed&uid=5044281310&fetch_level=0&locale=zh-CN'
    url = 'https://weibo.com/ajax/statuses/buildComments'
    #查询参数
    data = {
        'is_reload': '1',
        'id':'5090919693681101',
        'is_show_bulletin': '2',
        'is_mix': '0',
        'max_id': MaxId,
        'count': '20',
        'type': 'all',
        'uid': '2706896955',
        'fetch_level': '0',
        'locale': 'zh-CN'
    }

    #发送请求
    #response = requests.get(url=url,headers=headers)
    #response = requests.get(url=url,params=data,headers=headers,proxies=proxies,timeout=(3,7))

    """获取数据"""

    #获取响应的json数据
    #捕获异常,防止程序因为异常而终止
    try:
        response = requests.get(url=url,params=data,headers=headers,proxies=proxies,timeout=(1,1.5))

        # 检查响应状态码
        if response.status_code == 200:
            try:
                json_data = response.json()
                data_list = json_data['data']
                # return data_list
            except requests.exceptions.JSONDecodeError:
                print("Response content is not valid JSON")
                return None
        else:
            print(f"Request failed with status code {response.status_code}")
            return None
    except requests.exceptions.RequestException as e:
        print(f"An error occurred: {e}")
        return None

    #print(json_data)
    #字典取值,提取评论信息所在列表
    #data_list = json_data['data'] #一般一次请求是一个data包,是20条评论
    """解析数据"""
    for index in data_list:
        #print(index)
        # 提取具体数据内容,保存字典中
        dit = {
        '昵称': index['user']['screen_name'],
        '地区': index['source'].replace('来自', ''),
        '评论': index['text_raw']
        }
        print(dit)
        

        """保存数据"""
        csv_writer.writerow(dit)
    #获取下一页Mix_id
    # 获取下一页max_id
    max_id = json_data['max_id']
    # 返回
    # 关闭文件
    f.close()
    return max_id

max_id = 0
page_count = 0

for page in range(1,20000):#通过循环获取max_id以达到翻页的效果
    print(f'正在采集第{page}页的数据内容')
    max_id = GetContent(MaxId=max_id)
    time.sleep(random.uniform(0.1, 0.5)) # 等待0.1到0.5秒再重新采集数据

总结

本周通过对一个爬虫具体案例的学习,总结了爬取任意网站数据的通用流程和思路。通过对实例代码的改进,利用代理ip池成功爬取了一百万的评论数据量。


http://www.kler.cn/a/402391.html

相关文章:

  • C++11特性(详解)
  • 加菲工具 - 好用免费的在线工具集合
  • 【1.3 Getting Started--->Release Notes】
  • Excel如何批量导入图片
  • AI领域一些技术和概念
  • 【机器学习】——卷积与循环的交响曲:神经网络模型在现代科技中的协奏
  • 深入探索淘宝API:高效实现关键字搜索商品列表的技术实践
  • 企业软文推广如何巧妙借力优质媒体,让品牌在市场中脱颖而出?媒介盒子分享
  • 2411rust,1.81,1.82
  • Charles抓https包-配置系统证书(雷电)
  • Elasticsearch:更好的二进制量化(BBQ)对比乘积量化(PQ)
  • 自我通信11
  • STM32学习笔记----UART、IIC、SPI的区别
  • 鸿蒙NEXT开发-用户通知服务的封装和文件下载通知
  • Vue 3 中使用 `<script setup>` 语法糖实现模板插值表达式
  • TongRDS 可视化连接
  • 机器学习极简史
  • 大数据新视界 -- 大数据大厂之大数据与虚拟现实的深度融合之旅
  • mybatis-plus雪华算法
  • Git如何简单使用
  • Chainlit快速实现AI对话应用将聊天记录的持久化到MySql关系数据库中
  • D69【 python 接口自动化学习】- python 基础之数据库
  • Golang | Leetcode Golang题解之第564题寻找最近的回文数
  • 如何使用ChatGPT写推荐信?
  • 阿里巴巴工程师最新版 1180 道 Java 面试题及答案整理
  • 【单片机硬件基础】CPU结构和功能