微博搜索爬虫

网页分析

由于网页端反爬虫机制比较完善所以才去移动端进行爬虫。

url地址:https://m.weibo.cn/

python微博搜索结果 微博搜索爬虫_数据

搜索框,输入关键词进行搜索

python微博搜索结果 微博搜索爬虫_爬虫_02

对网页进行抓包,找到相关数据

python微博搜索结果 微博搜索爬虫_数据_03

查看数据是否与网页的内容相同

python微博搜索结果 微博搜索爬虫_python微博搜索结果_04

分析多组数据的请求头

python微博搜索结果 微博搜索爬虫_数据_05

python微博搜索结果 微博搜索爬虫_python微博搜索结果_06

python微博搜索结果 微博搜索爬虫_搜索_07

 

编写程序

构造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)

python微博搜索结果 微博搜索爬虫_搜索_08

获取相关数据

通过对网页分析,该网页获取的数据为json格式的数据

import json
......
#对返回结果判断,如果是200,则把数据转为json格式
if html.content:
    response = html.json()

python微博搜索结果 微博搜索爬虫_搜索_09

数据为字典类型

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)

查看结果

python微博搜索结果 微博搜索爬虫_搜索_10

获取到的数据保存到.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” 文件

python微博搜索结果 微博搜索爬虫_数据_11

python微博搜索结果 微博搜索爬虫_python微博搜索结果_12

完成程序编写。

 

对源代码进行改进

目前只是爬取一页的结果,以及每次搜索不同的关键词都要改源代码内容。

为了让该程序实用美观,引用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()

python微博搜索结果 微博搜索爬虫_爬虫_13

对程序改进

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)

python微博搜索结果 微博搜索爬虫_python微博搜索结果_14

python微博搜索结果 微博搜索爬虫_爬虫_15

python微博搜索结果 微博搜索爬虫_数据_16