微博搜索爬虫
网页分析
由于网页端反爬虫机制比较完善所以才去移动端进行爬虫。
url地址:https://m.weibo.cn/
搜索框,输入关键词进行搜索
对网页进行抓包,找到相关数据
查看数据是否与网页的内容相同
分析多组数据的请求头
编写程序
构造url地址
通过网页分析构造url地址对,地址信息访问。
import requests
#构造搜索内容
data = {
'containerid':'100103type=1&q=电影',
'page_type':'searchall',
'page':'1',
}
#反爬虫,模拟游览器访问
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36',}
url = "https://m.weibo.cn/api/container/getIndex?"
#通过GET方式访问该网站
html = requests.get(url,headers=headers,params=data)
#打印结果,如果返回200,则访问成功
print(html)
获取相关数据
通过对网页分析,该网页获取的数据为json格式的数据
import json
......
#对返回结果判断,如果是200,则把数据转为json格式
if html.content:
response = html.json()
数据为字典类型
import re
.......
#提取数据
cards = response["data"]["cards"]
result = []
#遍历cards列表
for card in cards:
#判断"mblog"键是否存在该字典中
mblogs = "mblog"
if mblogs in card:
#提取正文内容
text = card[mblogs]["text"]
#对正文进行提取,利用正则表达式删除HTML标签
#re.compile正则表达式的字符串创建模式对象,re.S使.匹配包括换行在内的所有字符
dr = re.compile(r'<[^>]+>',re.S)
#把数据以字典的形式保存在列表中
result.append({
'发布时间':card[mblogs]["created_at"],
'用户id':card[mblogs]["user"]["id"],
'用户名':card[mblogs]["user"]["screen_name"],
'微博地址':card[mblogs]["user"]["profile_url"],
'转发数':card[mblogs]["reposts_count"],
'评论数':card[mblogs]["comments_count"],
'点赞数':card[mblogs]["attitudes_count"],
'正文':dr.sub('',text)})
print(result)
查看结果
获取到的数据保存到.cvs文件中
import csv
import time
from csv import DictWriter
......
#保存文件
#文件的名字
file_name = '电影.csv'
header = ['发布时间','用户id','用户名','微博地址','转发数','评论数','点赞数','正文']
with open(file_name,'a',newline = "",encoding = 'gb18030') as f:
f_csv = DictWriter(f,header) #DictWriter以字典形式写入
#防止header重复写入
with open(file_name, 'r', encoding='gb18030', newline="") as file:
reader = csv.reader(file)
if not [row for row in reader]:
f_csv.writeheader()
f_csv.writerows(result)
else:
f_csv.writerows(result)
#延时,防止反爬机制
time.sleep(0.1)
查看是否生成 “电影.csv” 文件
完成程序编写。
对源代码进行改进
目前只是爬取一页的结果,以及每次搜索不同的关键词都要改源代码内容。
为了让该程序实用美观,引用tkinter建立GUI界面。
from tkinter import * #tkinter可以快速创建GUI应用程序
from csv import DictWriter
......
#创建一个窗口
root = Tk()
#设计窗口大小以及位置 宽高400*100 位置(650,400)
root.geometry('405x80+650+400')
#设计窗口标题
root.title('微博搜索')
#标签控件
labl1 = Label(root,text = '关键词:',font = ('华文行楷',18))
#网格显示标签,靠左显示
labl1.grid(sticky=W)
#输入框
entry = Entry(root,font = ('华文行楷',18))
#网格显示标签
entry.grid(row=0,column=1,sticky=W)
#搜索按钮
button = Button(root,text = '搜索',font = ('华文行楷',15),command=sign)
#command=sign对程序进行对接
#网格式显示
button.grid(row=0,column=3,sticky=E)
#显示窗口
root.mainloop()
对程序改进
def sign():
#获取输入结果
key_word = entry.get()
#去除输入框的空格
key_word = key_word.strip()
#判断输入是否为空
if key_word == '':
#提示信息
messagebox.showinfo(title = '提示',message = '请输入关键词')
#构造搜索内容
else:
for i in range(1,20):
data = {
'containerid':'100103type=1&q{}'.format(key_word),
'page_type':'searchall',
'page':i,
}
......
#文件的名字
file_name = key_word + '.csv'
......
#显示生成文件
#标签控件
labl2 = Label(root,text = '查询完成:{}'.format(file_name),font = ('华文行楷',15))
#网格显示标签,靠左显示
labl2.grid(row=1,column=1)