目录
1、构造header
为了要模仿浏览器操作,所以我们要伪造一下header(为防止恶意操作,这里不分享构造方法)
根据开发者工具里的信息,我们发现是GET请求, parameter部分我们只留下四个有用的(附带一个jsonp=>返回值是json)
2、代码走起
代码的详细注释已经在下方展示了,再此就不再赘述了。
header = {
.............................
}
def search(par):
return requests.get("https://api.bilibili.com/x/web-interface/search/type", params=par, headers=header).json()
def collect():
# 连接数据路
db = pymysql.connect(host="127.0.0.1", user="root", passwd="*****", db="sisters", charset='utf8')
cursor = db.cursor()
# 新建一个文本文档用于输出重复的结果
err_text = open("error.txt", "a+")
# 构造返回值中有用的用户信息的"键(Key)"
construct_sis = ["mid", "uname", "upic", "usign", "level", "gender", "fans", "videos", "is_upuser"]
# Get请求时传递的参数
query = {
"search_type": "bili_user",
"keyword": "",
"page": 1,
"jsonp": "jsonp",
}
# for循环进行爬取数据(0号 到 20001号 -> Last order)
for cnt in range(0, 20002):
print("Searching ", cnt)
# 根据循环次数来更新本次搜索的是御坂xx号
query["keyword"] = "御坂" + str(cnt)
# 先进行一次接口访问,获取结果的总页数用于第二层for循环
# (原因是返回的数据是分页的,要二次循环来获取对于一个关键字的所有搜索结果)
total_pages = search(query)["data"]["numPages"]
# 从1到总页数进行二层循环
for i in range(1, total_pages + 1):
# 更新本次查询的页数
query["page"] = i
# 获取本次(本关键字、本页)的搜索结果
response = search(query)["data"]
# 取出所有用户信息
sisters = response["result"]
# 构造 value 执行mysql语句,将信息存入数据库
for sis in sisters:
value = []
# construct_sis中是所有我们需要的键,用于获取对应的值添加进value
for item in construct_sis:
value.append(sis[item])
# MySQL添加语句
sql = "INSERT INTO sisters.network(mid, name, pic, sign, ulevel, gender, fans, videos, up) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s)"
try:
cursor.execute(sql, value)
except pymysql.err.IntegrityError as err:
# 如果捕获到异常,将主键重复信息输出到文本文档中
err_text.write(str(sis["mid"]) + " " + sis["uname"] + " --- Already existed." + "\n")
# 提交数据库更新
db.commit()
# 关闭数据库连接
db.close()
OK,等待运行完毕,我们就可以查看 成果 了!
不好意思,老板再来一斤花生米!【下面才是成果】(其实上面也是)