微博搜索爬虫

网页分析

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

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)

Python 微博搜索爬虫的更多相关文章

  1. 简单的抓取淘宝关键字信息、图片的Python爬虫|Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇)

    Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇) 淘宝改字段,Bugfix,查看https://github.com/hunterhug/taobaoscrapy.git 由于Gith ...

  2. 初探爬虫 ——《python 3 网络爬虫开发实践》读书笔记

    零.背景 之前在 node.js 下写过一些爬虫,去做自己的私人网站和工具,但一直没有稍微深入的了解,借着此次公司的新项目,体系的学习下. 本文内容主要侧重介绍爬虫的概念.玩法.策略.不同工具的列举和 ...

  3. Python 开发轻量级爬虫07

    Python 开发轻量级爬虫 (imooc总结07--网页解析器BeautifulSoup) BeautifulSoup下载和安装 使用pip install 安装:在命令行cmd之后输入,pip i ...

  4. Python编写网页爬虫爬取oj上的代码信息

    OJ升级,代码可能会丢失. 所以要事先备份. 一開始傻傻的复制粘贴, 后来实在不能忍, 得益于大潇的启示和聪神的原始代码, 网页爬虫走起! 已经有段时间没看Python, 这次网页爬虫的原始代码是 p ...

  5. python 3.x 爬虫基础---常用第三方库(requests,BeautifulSoup4,selenium,lxml )

    python 3.x 爬虫基础 python 3.x 爬虫基础---http headers详解 python 3.x 爬虫基础---Urllib详解 python 3.x 爬虫基础---常用第三方库 ...

  6. Ruby用百度搜索爬虫

    Ruby用百度搜索爬虫 博主ruby学得断断续续,打算写一个有点用的小程序娱乐一下,打算用ruby通过百度通道爬取网络信息. 第三方库准备 mechanize:比较方便地处理网络请求,类似于Pytho ...

  7. python 3.x 爬虫基础---正则表达式

    python 3.x 爬虫基础 python 3.x 爬虫基础---http headers详解 python 3.x 爬虫基础---Urllib详解 python 3.x 爬虫基础---Requer ...

  8. python 3.x 爬虫基础---Requersts,BeautifulSoup4(bs4)

    python 3.x 爬虫基础 python 3.x 爬虫基础---http headers详解 python 3.x 爬虫基础---Urllib详解 python 3.x 爬虫基础---Requer ...

  9. Python学习网络爬虫--转

    原文地址:https://github.com/lining0806/PythonSpiderNotes Python学习网络爬虫主要分3个大的版块:抓取,分析,存储 另外,比较常用的爬虫框架Scra ...

随机推荐

  1. Codepen 每日精选(2018-4-6)

    按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以打开原始页面. 按照画出的路线吃豆子的交互动画https://codepen.io/createjs/f... 模拟真实手 ...

  2. jsp+servlet上传excel并将数据导入到数据库表的实现方法

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  3. idea 配置mapper.xml代码提示

    从代码跳转mapper文件的插件: 在mapper文件中添加dtd约束: 1.下载dtd约束文件 http://mybatis.org/dtd/mybatis-3-config.dtd   http: ...

  4. Android点击按钮退出程序并提醒

    效果展示: MainActivity.java import androidx.appcompat.app.AppCompatActivity; import android.app.AlertDia ...

  5. OllyDbg---比较、条件跳转指令

    比较和条件跳转 CMP 比较两个操作数,相当于SUB指令,但是相减的结果不保存到第一个操作数,而是根据相减的结果来改变零标志位.当两个操作数相等时,零标志位Z置为1. 两个操作数不相等时,零标志位Z被 ...

  6. eclipse 执行main方法 错误: 找不到或无法加载主类

    检查环境变量是否正确 JAVA_HOME JAVA的实际安装目录 CLASSPATH .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\ ...

  7. Java语言学习day02--6月29日

    Java语言学习day02###01常用的DOS命令 * A: 常用的DOS命令 * a: 打开Dos控制台 * win+r--cmd--回车 * b: 常用dos命令 * cd.. : 退回到上一级 ...

  8. switch 和 if else if else 有什么区别

    1.  一般情况下,它们两个语句可以相互替换 2.  switch..case语句通常处理case为比较确定值的情况,而if...else...语句更加灵活,常用于范围判断(大于.等于某个范围) 3. ...

  9. BUUCTF-Web:[GXYCTF2019]Ping Ping Ping

    题目 解题过程 1.题目页面提示?ip=,猜测是让我们把这个当做变量上传参数,由此猜想是命令注入 2.用管道符加上linux常用命令ls(windwos可以尝试dir)试试 所谓管道符(linux)的 ...

  10. 单列集合(Collection-Set)

    (部分) Set类特点: "无序"(输入顺序和存储顺序不一样) HashSet 底层是HashMap 关于不能有重复元素/对象 遇到的问题: 解决办法:重新类的相关方法 选择名字和 ...