微博搜索爬虫
网页分析
由于网页端反爬虫机制比较完善所以才去移动端进行爬虫。
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)