目录
- 前言
- 编写代码
- 总结
前言
这次我们来获取一下微博,包括时间、评论数、点赞数和内容。本次以“四川农业大学的”为关键词获取到相关数据。来看一看效果吧。
编写代码
1.分析网页
还是老套路,右键点击检查。发现我们需要的数据原来的网页里就有。这就很简单了。 唯一需要注意的是微博你不登录你就只能看到第一页的搜索结果,登录后也只能看到前50页的搜索结果。所以我们的请求头里必须带上cookie。还有一点,微博内容过长时,它会折叠起来。展开的内容标签就在折叠内容标签的下方。如果是没有展开全文的内容的话,p标签下就只会有一个a标签。 然后我们来看看请求的参数。这个请求的表单内q是搜索的内容,timescope是搜索的时间范围,page是页数。因为我这次就只是获取以“四川农业大学的”为关键字,2021年1月1日至2021年5月5日内的微博,所需要更改的参数只有page,所以我没有采用表单的形式请求,而是直接在url上进行拼接。如果不会使用表单的话可以看我上一篇文章。8684网站航班数据获取那篇文章就采用了表单请求的方式。
2.编写代码
首先是获取数据的函数。
def get_html(url):
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Cookie': '你的cookie',
'Host': 's.weibo.com',
'Pragma': 'no-cache',
'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90"',
'sec-ch-ua-mobile': '?0',
'Sec-Fetch-Dest': 'document',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-Site': 'none',
'Sec-Fetch-User': '?1',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36'
}
res = requests.get(url,headers=headers)
if res.status_code == 200:
print('获取成功')
return res.text
else:
print('失败')
然后是解析数据的函数。
def jianxi(res):
data = []
res = re.findall('<!--card-wrap-->(.*?)<!--/card-wrap-->',res,re.S)
for r in res:
xp = etree.HTML(r)
n = xp.xpath('//p[@class="txt" and @node-type="feed_list_content_full"]//text()')
if len(n) == 0:
n = xp.xpath('//p[@class="txt" and @node-type="feed_list_content"]//text()')
t = xp.xpath('//div[@class="content"]/p[@class="from"]/a[1]/text()')
p = xp.xpath('//div[@class="card-act"]//li[3]/a/text()')[0]
d = xp.xpath('//div[@class="card-act"]//li[4]//em/text()')
if len(d) != 0:
d = d[0]
else :
d = '0'
p =re.findall('\d*',p)
p = ''.join('%s' % r.split() for r in p).replace('[', '').replace(']', '').replace('\'', '')
if p == '':
p = '0'
t = ''.join(t[0].split())
n = ''.join('%s' %r.split() for r in n).replace('[','').replace(']','').replace('\'','')
n = re.sub(r'\\u...','',n)
n = re.sub(r'收起全文d','',n)
data.append({'时间': t, '评论数': p, '点赞数': d, '内容': n})
return data
最后是写入表格的函数。
def write_data(datas):
wb = load_workbook('四川农业大学相关微博.xlsx')
ws = wb.create_sheet('四川农业大学相关微博', 0)
ys = {
'A':'时间',
'B':'评论数',
'C':'点赞数',
'D':'内容'
}
for key, value in ys.items():
ws[key + '1'] = value
b = 0
for data in datas:
for n in range(len(list(data.values())[0])):
for key, value in ys.items():
ws[key + str(n + 2 + b)] = list(data.values())[0][n][value]
b += len(list(data.values())[0])
wb.save('四川农业大学相关微博.xlsx')
3.总的代码
#coding:utf-8
from openpyxl import Workbook
from openpyxl import load_workbook
from lxml import etree
import requests
import time,re
def get_html(url):
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Cookie': '你的cookie',
'Host': 's.weibo.com',
'Pragma': 'no-cache',
'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90"',
'sec-ch-ua-mobile': '?0',
'Sec-Fetch-Dest': 'document',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-Site': 'none',
'Sec-Fetch-User': '?1',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36'
}
res = requests.get(url,headers=headers)
if res.status_code == 200:
print('获取成功')
return res.text
else:
print('失败')
def jianxi(res):
data = []
res = re.findall('<!--card-wrap-->(.*?)<!--/card-wrap-->',res,re.S)
for r in res:
xp = etree.HTML(r)
n = xp.xpath('//p[@class="txt" and @node-type="feed_list_content_full"]//text()')
if len(n) == 0:
n = xp.xpath('//p[@class="txt" and @node-type="feed_list_content"]//text()')
t = xp.xpath('//div[@class="content"]/p[@class="from"]/a[1]/text()')
p = xp.xpath('//div[@class="card-act"]//li[3]/a/text()')[0]
d = xp.xpath('//div[@class="card-act"]//li[4]//em/text()')
if len(d) != 0:
d = d[0]
else :
d = '0'
p =re.findall('\d*',p)
p = ''.join('%s' % r.split() for r in p).replace('[', '').replace(']', '').replace('\'', '')
if p == '':
p = '0'
t = ''.join(t[0].split())
n = ''.join('%s' %r.split() for r in n).replace('[','').replace(']','').replace('\'','')
n = re.sub(r'\\u...','',n)
n = re.sub(r'收起全文d','',n)
data.append({'时间': t, '评论数': p, '点赞数': d, '内容': n})
return data
def write_data(datas):
wb = load_workbook('四川农业大学相关微博.xlsx')
ws = wb.create_sheet('四川农业大学相关微博', 0)
ys = {
'A':'时间',
'B':'评论数',
'C':'点赞数',
'D':'内容'
}
for key, value in ys.items():
ws[key + '1'] = value
b = 0
for data in datas:
for n in range(len(list(data.values())[0])):
for key, value in ys.items():
ws[key + str(n + 2 + b)] = list(data.values())[0][n][value]
b += len(list(data.values())[0])
wb.save('四川农业大学相关微博.xlsx')
if __name__ == '__main__':
wb = Workbook()
wb.save('四川农业大学相关微博.xlsx')
datas = []
for i in range(1,51):
url = 'https://s.weibo.com/weibo/%25E8%25B5%25B5%25E7%259D%25BF%25E5%258F%2597%25E4%25BC%25A4?q=%E5%9B%9B%E5%B7%9D%E5%86%9C%E4%B8%9A%E5%A4%A7%E5%AD%A6%E7%9A%84&typeall=1&suball=1×cope=custom:2021-01-01:2021-05-05&Refer=g&page='+str(i)
res = get_html(url)
data = jianxi(res)
print(i,data)
datas.append({str(i): data})
time.sleep(0.5)
write_data(datas)
总结
本次代码没什么难度,看了后是不是感觉很轻松。这篇写完后我就要休息一段时间,为下次的文章准备内容了。下次见!