最近学了一些Python爬虫,很多网站爬取还是非常简单的,比如第二页的链接中基本会出现page=2,这样的网站爬起来非常方便。但是,有的网站比如接下来要将的腾讯云社区,对于爬虫做了一些防护。下面,我来分享一下我的爬取腾讯云社区内容的探索经历。
分析
首先输入搜索Python后,拉到页面最下,可以看到“点击加载更多按钮”。
在检查界面的network中,我们可以看到他发送了/search?action=SearchList这个链接。
打开这个链接后,我们能在preview中找到下一页的内容,那么基本就确立了这个链接的内容就是我们需要的。
但是这个链接无论是第几页都是这个,因而猜测某些页码信息隐藏在Headers中,经过一番寻找,终于在Payload找到了一些属性。
我们可以猜测pageNumber属性就是页码数,q属性就是代表搜索的内容。因而我用python尝试了一下,将pageNumber改成3,q改成python3,拿到的就是搜索python3的第三页内容。最终假设成立,就需要开始干活了。
添加Payload信息
直接添加payload属性,
payload = {"action": "SearchList", "payload": {"pageNumber": i, "q": "python", "searchTab": "article"}}
在post中添加json=payload。
html = requests.post(url=url, json=payload, headers=headers).content.decode("utf-8","ignore")
写入数据库(可以跳过)
由于搜索到的数据量非常大,因而为了方便之后的查看,我将其写入了数据库。当然,你不会数据库的话可以生成csv文件,这里仅提供写入数据库的方法。如果你的电脑没有安装数据库,我这提供一个非常简单的安装方法,使用phpstudy。
安装后可以启动WNMP环境,然后可以使用phpmyadmin查看编辑数据库。在里面新建cloud_tecent数据库,然后在其中新建article数据表。
最后调用pymysql模块编辑数据库
# 连接本地数据库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()
全部代码
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)