爬取流程
- 先找到浏览器标识头(User-Agent也可以网上搜这个头子)
红圈是头,复制出来 - (关键)找传回数据的url
目标网站:b站搜索
爬取这个:
开始我直接通过网页渲染数据爬取框内内容,发现这些内容是ajax请求渲染,网站加载完成才渲染出数据,不能第一时间爬取到,然后我开始另辟蹊径。。。找了好久终于找到
找到传回数据后面就好办了。。。。 - 代码实现
先导需要的库 ,mysql连python用到: pip install pymysql
#python程序
#字典
import requests
import json
import pymysql.cursors
#加头标识
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36'
}
product=[]
#获取传回数据
resp=requests.get('https://s.search.bilibili.com/main/hotword?mid=&buvid=98E676EF-F586-403E-8440-52A6836FA68713451infoc&jsonp=jsonp&callback=jsonCallback_bili_58910703464582290',headers=headers)
rest=resp.text.replace('jsonCallback_bili_58910703464582290(','').replace(')','')
#转换json键值对
json_data=json.loads(rest)
comments=json_data["list"]
# #把想要的数据装入列表中
proDict=[]
for item in comments:
proDict.append(item['keyword']+' ')
product.extend(proDict)
# 把数组里所有数据都转入字符串中(这里是学习用的,可以去除)
p=''.join(proDict)
print(p)
# 数据入库
# 连接数据库
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
passwd='root',
db='bilidb',
charset='utf8',
cursorclass=pymysql.cursors.Cursor,
)
cur=conn.cursor()
#这里用replace解决数据入库时重复数据的问题,注意hotword字段要设置唯一约束
for item in proDict:
cur.execute("replace into hot(hotword) values('%s')" %(item))
#事务提交(这里尝试性的用了一个异常处理,嘿嘿可以去掉)
try:
conn.commit()
except AttributeError:
print("错误")
cur.close()
数据库结构
数据库上记得把字段设置编码方式为utf-8,以解决中文乱码问题。