hp-mzx

微博搜索爬虫

网页分析

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

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

1

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

2

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

3

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

4

分析多组数据的请求头

5

6

7

 

编写程序

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

8

获取相关数据

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

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

9

数据为字典类型

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)

查看结果

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” 文件

11

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()

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)

14

15

16

 

分类:

技术点:

相关文章: