一次爬取腾讯云社区文章的经历分享

2022-05-17 19:00:23 浏览数 (1)

最近学了一些Python爬虫,很多网站爬取还是非常简单的,比如第二页的链接中基本会出现page=2,这样的网站爬起来非常方便。但是,有的网站比如接下来要爬的腾讯云社区,对于爬虫做了一些防护。下面,我来分享一下我的爬取腾讯云社区内容的探索经历。

分析

首先输入搜索Python后,拉到页面最下,可以看到“点击加载更多按钮”。

在检查界面的network中,我们可以看到他发送了/search?action=SearchList这个链接。

打开这个链接后,我们能在preview中找到下一页的内容,那么基本就确立了这个链接的内容就是我们需要的。

但是这个链接无论是第几页都是这个,因而猜测某些页码信息隐藏在Headers中,经过一番寻找,终于在Payload找到了一些属性。

我们可以猜测pageNumber属性就是页码数,q属性就是代表搜索的内容。因而我用python尝试了一下,将pageNumber改成3,q改成python3,拿到的就是搜索python3的第三页内容。最终假设成立,就需要开始干活了。

添加Payload信息

直接添加payload属性,

代码语言:javascript复制
payload = {"action": "SearchList", "payload": {"pageNumber": i, "q": "python", "searchTab": "article"}}

在post中添加json=payload。

代码语言:javascript复制
html = requests.post(url=url, json=payload, headers=headers).content.decode("utf-8","ignore")

写入数据库(可以跳过)

由于搜索到的数据量非常大,因而为了方便之后的查看,我将其写入了数据库。当然,你不会数据库的话可以生成csv文件,这里仅提供写入数据库的方法。如果你的电脑没有安装数据库,我这提供一个非常简单的安装方法,使用phpstudy。

安装后可以启动WNMP环境,然后可以使用phpmyadmin查看编辑数据库。在里面新建cloud_tecent数据库,然后在其中新建article数据表。最后调用pymysql模块编辑数据库

代码语言:javascript复制
# 连接本地数据库cloud_tecent
connectSql = pymysql.connect(host="127.0.0.1", user="root", passwd="321369", db="cloud_tecent")
for j in range(0,len(title),2):
    title1 = str(title[j])
    #去除标题中<em>和</em>
    title2 = title1.replace("<em>", "")
    title2 = title2.replace("</em>", "")
    link1 = "/developer/article/" link[j]
    m = int(j/2)
    comment1 = comment[m]
    # 写入数据表 title link comment
    sql = "insert into article(title,link,comment) value('" title2 "','" link1 "','" comment1 "')"
    connectSql.query(sql)
    connectSql.commit()

全部代码

代码语言:javascript复制
import json
import pymysql
import re
import requests
def get_cloudtecent(i):
    url = 'https://cloud.tencent.com/developer/services/ajax/search?action=SearchList'
    headers = {
        'Content-Type': 'application/json;charset=UTF-8',
        'Cookie': '请填入你的cookie',
        'Referer': 'https://cloud.tencent.com/developer/search/article-python',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36',
        'accept-language': 'zh - CN, zh;q = 0.9',
        'accept': 'application/json, text/plain, */*'
    }
    payload = {"action": "SearchList", "payload": {"pageNumber": i, "q": "python", "searchTab": "article"}}

    html = requests.post(url=url, json=payload, headers=headers).content.decode("utf-8","ignore")
    print(html)
    title = re.compile('"article":{"id":.*?"articleId":.*?"title":"(.*?)"',re.S).findall(html)
    # 测试的时候输出这三个值验证正则表达式
    #print(title)
    link = re.compile('"articleId":(.*?),',re.S).findall(html)
    #print(link)
    comment = re.compile('"summary":"(.*?)"',re.S).findall(html)
    #print(comment)
    # 连接本地数据库cloud_tecent
    connectSql = pymysql.connect(host="127.0.0.1", user="root", passwd="321369", db="cloud_tecent")
    for j in range(0,len(title),2):
        title1 = str(title[j])
        #去除标题中<em>和</em>
        title2 = title1.replace("<em>", "")
        title2 = title2.replace("</em>", "")
        link1 = "/developer/article/" link[j]
        m = int(j/2)
        comment1 = comment[m]
        # 写入数据表 title link comment
        sql = "insert into article(title,link,comment) value('" title2 "','" link1 "','" comment1 "')"
        connectSql.query(sql)
        connectSql.commit()
# 爬前五页
for i in range(1,5):
    get_cloudtecent(i)

结果

最终结果

0 人点赞