翼度科技»论坛 编程开发 python 查看内容

爬虫实战:从HTTP请求获取数据解析社区

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
在过去的实践中,我们通常通过爬取HTML网页来解析并提取所需数据,然而这只是一种方法。另一种更为直接的方式是通过发送HTTP请求来获取数据。考虑到大多数常见服务商的数据都是通过HTTP接口封装的,因此我们今天的讨论主题是如何通过调用接口来获取所需数据。
目前来看,大多数的http接口数据都采用restful风格,通常使用JSON格式来发送和接收数据。对于那些对此不太了解的零基础学者,建议先学习相关知识点。在本章学习过程中,我们将主要以腾讯云开发者社区作为主要平台,练习爬取接口数据。
接口爬取

接口爬取并不复杂,首先需要在浏览器中打开腾讯云社区的网页,然后按下F12打开控制台,接着浏览控制台中的请求数据接口,有些接口可能一眼难以识别,但通常可以跳过细致查看,因为在开发过程中,最关键的是能从名称中直观理解其作用,大型公司通常设计得相当清晰。我们首先尝试爬取主页的活动数据。

我们可以选择使用XHR来单独查看请求,这样就能排除掉页面、js、css等无关的请求,逐个检查接口,找到我们需要的内容。这个特定接口就是我们必须记住的,其他的都是多余的。
便利工具

在这里,我们想向大家介绍一个非常实用的开发爬虫工具,它就是https://curlconverter.com/
我是通过偶然的机会发现了这个工具的,它的确大大提升了我的爬虫效率。通常情况下,当我们找到了需要爬取的接口时,我们需要编写Python代码来发起请求,可能还要处理各种请求头和cookie,这一过程会消耗大量时间。而这个工具则帮助我们省去了这些繁琐的步骤,使得整个过程变得更加高效。
首先,我们在后台查找到目标请求,然后通过右键点击复制该请求。以Edge浏览器为例,具体操作如下所示:

在将内容复制后,我们可以直接前往这个在线工具网站,将其粘贴进去,从而生成相应的Python代码。这里以使用requests库为例进行演示。当你浏览该网站时,你可以选择你喜欢的任何编程语言进行相应代码的生成。

我们只需简单地将其复制粘贴到IDE中,然后便可直接运行代码。
社区首页

一旦我们掌握了这种方法,基本上就可以获取想要爬取的所有数据,只要避免频繁请求而被识别为机器人爬虫。让我们首先尝试爬取社区首页的文章,以了解今年哪些类别的文章备受关注。以下是示例代码:
  1. import datetime
  2. import requests
  3. ad_list = []
  4. article_list = []
  5. article_total = 0
  6. def get_article_list(pageNumber):
  7.     global article_total,article_list
  8.     ## 这里不需要cookie也是可以的。
  9.     headers = {
  10.         'authority': 'cloud.tencent.com',
  11.         'accept': 'application/json, text/plain, */*',
  12.         'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
  13.         'content-type': 'application/json',
  14.         'cookie': 'qcloud_uid=3db7bb7a1663470df3290f692c4a7206; language=zh; lastLoginIdentity=e382a0dd45ecf7f063e05751e7321e14; _ga_6WSZ0YS5ZQ=GS1.1.1685003902.1.1.1685004114.0.0.0; loginType=email; _ga_7PG2H0XLX2=GS1.2.1705284469.2.1.1705284470.59.0.0; lastLoginType=email; _gcl_au=1.1.315225951.1705902067; _ga_95GG3X2GMT=GS1.1.1707206895.14.0.1707212112.0.0.0; _ga=GA1.2.100014169188; mfaRMId=0092627a989e3ef79957c2257ea910f8; qcloud_from=qcloud.google.seo-1709083904498; qcstats_seo_keywords=%E5%93%81%E7%89%8C%E8%AF%8D-%E5%93%81%E7%89%8C%E8%AF%8D-%E8%85%BE%E8%AE%AF%E4%BA%91; from_column=20421; cpskey=1f39dac98ac4cc96c6503bdb4f49994f; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22100014169188%22%2C%22first_id%22%3A%221878e0e485111b-0be585a75d9ef-7e57547d-2073600-1878e0e4852ec0%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_utm_medium%22%3A%22ocpc%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTg3OGUwZTQ4NTExMWItMGJlNTg1YTc1ZDllZi03ZTU3NTQ3ZC0yMDczNjAwLTE4NzhlMGU0ODUyZWMwIiwiJGlkZW50aXR5X2xvZ2luX2lkIjoiMTAwMDE0MTY5MTg4In0%3D%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%24identity_login_id%22%2C%22value%22%3A%22100014169188%22%7D%2C%22%24device_id%22%3A%221878e0e485111b-0be585a75d9ef-7e57547d-2073600-1878e0e4852ec0%22%7D; qcmainCSRFToken=NSsz_8Bfx1S_; qcloud_visitId=3e799aa8be55222ade40e7ab9b8be875; intl=; _gat=1; trafficParams=***%24%3Btimestamp%3D1710467373372%3Bfrom_type%3Dserver%3Btrack%3Da7699f0f-3309-4c6b-9740-475f6c5f11ba%3B%24***',
  15.         'origin': 'https://cloud.tencent.com',
  16.         'referer': 'https://cloud.tencent.com/developer',
  17.         'sec-ch-ua': '"Chromium";v="122", "Not(A:Brand";v="24", "Microsoft Edge";v="122"',
  18.         'sec-ch-ua-mobile': '?0',
  19.         'sec-ch-ua-platform': '"Windows"',
  20.         'sec-fetch-dest': 'empty',
  21.         'sec-fetch-mode': 'cors',
  22.         'sec-fetch-site': 'same-origin',
  23.         'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0',
  24.     }
  25.     json_data = {
  26.         'pageNumber': pageNumber,
  27.         'pageSize': 100,
  28.         'type': 'recommend', ## 文章是否被推荐到首页
  29.     }
  30.     response = requests.post(
  31.         'https://cloud.tencent.com/developer/api/home/article-list',
  32.         headers=headers,
  33.         json=json_data,
  34.     )
  35.     news_list = response.json()
  36.     for article in news_list['list']:
  37.         ## 处理一下文章的类别
  38.         handle_tag(article)
  39.         ## 可以自己解析首页的文章,只拿你想要的
  40.         article_list.append({
  41.             "article_title": article['title'],
  42.             "article_date": article['createTime'],
  43.             "article_summary": article['summary']
  44.         })
  45.     article_total = news_list['total']
  46.     fixed_time = datetime.datetime(2023, 1, 1)
  47.     timestamp = int(fixed_time.timestamp())
  48.     print(f'{article_list[-1]["article_date"]}和{timestamp}')
  49.     ## 判断一下是否已经是最后一页
  50.     return 0 if article_list[-1]['article_date'] < timestamp else 1
  51. def handle_tag(article):
  52.     # 遍历解析后的数据,统计每个tagName的数据量
  53.     for item in article['tags']:
  54.         tag_name = item["tagName"]
  55.         if tag_name in tag_counts:
  56.             tag_counts[tag_name] += 1
  57.         else:
  58.             tag_counts[tag_name] = 1
  59. def get_top_10():
  60.     # 根据数据量对tagName进行排序
  61.     sorted_tag_counts = sorted(tag_counts.items(), key=lambda x: x[1], reverse=True)
  62.     # 取前10个tagName
  63.     top_10_tags = sorted_tag_counts[:10]
  64.     # 打印前10个tagName的数据量统计
  65.     for tag, count in top_10_tags:
  66.         print(f"{tag}: {count}")
  67. page_num = 1
  68. while True:
  69.     num = get_article_list(page_num)
  70.     page_num = page_num + 1
  71.     if num == 0:
  72.         break
  73.    
  74. get_top_10()
复制代码
代码首先通过API获取文章列表数据,然后遍历每篇文章的标签信息,统计每个标签出现的次数,最后输出每个标签和其对应的数据量。这样可以帮助用户了解哪些标签在文章中出现频率较高。除了这些,我还额外处理轮播活动的数据,获取更全面的活动信息。
  1. import datetime
  2. import requests
  3. ad_list = []
  4. def get_ads():
  5.     global ad_list
  6.     headers = {
  7.         'authority': 'cloud.tencent.com',
  8.         'accept': 'application/json, text/plain, */*',
  9.         'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
  10.         'content-type': 'application/json',
  11.         'origin': 'https://cloud.tencent.com',
  12.         'referer': 'https://cloud.tencent.com/developer',
  13.         'sec-ch-ua': '"Chromium";v="122", "Not(A:Brand";v="24", "Microsoft Edge";v="122"',
  14.         'sec-ch-ua-mobile': '?0',
  15.         'sec-ch-ua-platform': '"Windows"',
  16.         'sec-fetch-dest': 'empty',
  17.         'sec-fetch-mode': 'cors',
  18.         'sec-fetch-site': 'same-origin',
  19.         'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0',
  20.     }
  21.     json_data = {
  22.         'cate': 'cloud_banner',
  23.         'preview': False
  24.     }
  25.     response = requests.post('https://cloud.tencent.com/developer/api/common/getAds', headers=headers, json=json_data)
  26.     news_list = response.json()
  27.     ad_list = [{'pcTitle': item['content']['pcTitle'], 'url': item['content']['url']} for item in news_list['list']]
  28. get_ads()
  29. print(ad_list)
复制代码
我的文章

如果我们希望对我们自己的文章进行分析和处理,首先需要进行登录。原本我打算尝试通过编写代码实现免登录,但是仔细研究后台 JavaScript 和登录验证后发现实现起来涉及的内容过多,对我们这样以学习为主的学者来说并不适合。
确保我已经登录的标识是通过 cookie 实现的。Cookie 在这里的作用是保持用户登录状态,使用户在不同页面之间保持登录状态。由于 HTTP 是无状态的,需要一种方法来保持会话连接,而这种方法就是使用 Cookie。对于请求来说,Cookie 就是一串字符串,服务器会自动解析它,无需我们手动管理。因此,我只需在网页登录后使用工具复制粘贴 Cookie 即可。尽管我花费了一整天,但仍未成功编写代码实现登录并获取 Cookie。因此,我们最好选择最简单的方法。
示例代码如下:
  1. import requests
  2. def get_my_article(page_num):
  3.     headers = {
  4.         'authority': 'cloud.tencent.com',
  5.         'accept': 'application/json, text/plain, */*',
  6.         'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
  7.         'content-type': 'application/json',
  8.         'cookie': '',# 这里需要复粘贴你自己的cookie。
  9.         'origin': 'https://cloud.tencent.com',
  10.         'referer': 'https://cloud.tencent.com/developer/creator/article',
  11.         'sec-ch-ua': '"Chromium";v="122", "Not(A:Brand";v="24", "Microsoft Edge";v="122"',
  12.         'sec-ch-ua-mobile': '?0',
  13.         'sec-ch-ua-platform': '"Windows"',
  14.         'sec-fetch-dest': 'empty',
  15.         'sec-fetch-mode': 'cors',
  16.         'sec-fetch-site': 'same-origin',
  17.         'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0',
  18.     }
  19.     page_size = 20
  20.     json_data = {
  21.         'hostStatus': 0,
  22.         'sortType': 'create',
  23.         'page': page_num,
  24.         'pagesize': page_size,
  25.     }
  26.     response = requests.post(
  27.         'https://cloud.tencent.com/developer/api/creator/articleList',
  28.         headers=headers,
  29.         json=json_data,
  30.     )
  31.     news_list = response.json()
  32.     for article in news_list['list']:
  33.         # handle_tag(article)
  34.         # 这里我就不解析了,简单打印一下吧。
  35.         my_article_list.append({
  36.             "article_title": article['title'],
  37.             "article_date": article['createTime'],
  38.             "article_summary": article['summary']
  39.         })
  40.     article_total = news_list['total']
  41.     if page_num*page_size > article_total:
  42.         return 0
  43.     else:
  44.         return 1
复制代码
在这个函数中,参数page_num代表着要获取的文章列表页数。请务必留意,请求头中的headers需要包含用户自行提供的Cookie信息,这样才能确保程序正常运行。您可以在这里获取到Cookie信息,只需将其复制粘贴即可。详见下图:

总结

在过去的实践中,我们常常通过爬取HTML网页来解析和提取数据,因此今天我们讨论了如何通过调用接口来获取所需数据。本文通过示例代码展示了如何爬取社区首页的文章和活动数据,以及如何爬取自己的文章列表。通过这些实践,我们可以更好地理解和运用接口爬取技术。

来源:https://www.cnblogs.com/guoxiaoyu/p/18077918
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具