IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 爬取某个微博用户的所有微博内容及照片 -> 正文阅读

[Python知识库]爬取某个微博用户的所有微博内容及照片

因为今日头条似乎加入了反爬虫机制,所以ajax爬取今日头条街拍美图这个似乎做不出来了,于是找了微博用户作为替代,感觉两个例子比较相似,然后,个人感觉微博ajax爬取照片比较简单,而且能学到比较多的东西,然后也做出来了,下面是详细的教程:

首先,什么是ajax,ajax是异步的js和xml,具体的作用就是不更新网页的情况下,有新的数据,这个在微博中就非常常见了,我们打开个人主页去刷的时候,网页没有刷新,但是有新的内容更新,这个就是ajax最常见的的了,然后再理解一下,ajax是通过一个连接去找到对应的内容的。

下面,我们去通过微博(这里要注意,只有lite版的网页版微博才能找到ajax的信息,网址是https://m.weibo.cn)的页面进一步理解,以及,找到数据所在的地方,方便后面的爬取:

首先,我们搜索某个用户,并进入他的主页:

?(这样才是进入了某个用户的主页哦)

然后按下F12,看他的代码,打开网络,然后筛选器中,筛选frech/xhr,再按下Ctrl+R:

?(选中getindex开头的那个连接)

(这里选中之后会去看到他的响应内容,我们找到相应内容中有cards一项的)

?这里有几个参数是比较重要的,通过对比你会发现,不同用户只是uid和containerid不同,然后同一用户的主页中这个getindex的uid和containerid是一致的(比如这里中大官微的uid:1892723783,containerid:1076031892723783),每次ajax这部分不变,然后我们来看他的数据:

?发现文章的内容、转发量等信息放在了cards里面的的0-9里面的mblog中的text,然后再来看图片放在了哪里,我们找到original_pic,他是一个连接,我们把这个连接复制一下然后前往:

发现他是一张图片,可以用get请求下载下来,经过比较发现,微博图片都放在

https://wx1.sinaimg.cn/large/(pic_id).jpg?中,所以我们只要知道每条微博的图片的pic_id就可以下载所有的图片,然后这里,我们确实再mblog中发现了pic_ids这个数据条:

所以后面可以通过pic_ids构造连接的方法去获取图片。?

所以下面的工作就简单了,就是找到getindex连接,利用ajax不断刷新内容但不刷新页面,然后get请求抓照片:

这里先列出所有要import的包,可以先去下载一下:

from urllib.parse import urlencode
from pyquery import PyQuery as pq
from hashlib import md5
import requests
import re
import os

然后我们构造请求头和getindex都有的部分的url:

base_url='https://m.weibo.cn/api/container/getIndex?'
headers={
    'Host':'m.weibo.cn',
    'Referer':'https://m.weibo.cn/u/1892723783',
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36 Edg/92.0.902.84',
    'X-Requested-With':'XMLHttpRequest'
}

然后写获取一页getindex响应的函数:

#获取一个ajax的响应
def get_page(page):
    params={#构造getindex连接,要换不同的用户时,需要更换对应的uid和conternerid
        'type':'uid',
        'value':'1892723783',#uid value
        'containerid':'1076031892723783',
        'page':page
    }
    url=base_url+urlencode(params)#构造ajax的getindex url
    try:
        response=requests.get(url,headers=headers)#获取url的响应
        if response.status_code==200:
            return response.json()#返回响应的内容,并转成json格式,也就是再浏览器F12观察到的结构
    except requests.ConnectionError as e:
        print('Error',e.args)

然后写获取每个响应中图片的函数:

#保存每个card的图片
def save_image(item):
    if item:
        text=re.sub(r'[\\/\:\*\?\"\<\>\|\n]','',pq(item.get('text')).text())[0:128]
        #这里以微博内容作为文件名,所以要去掉文件命名非法符号,然后长度要在0:128之间
        if not os.path.exists('result/'+text):#如果不存在目标文件夹
            os.mkdir('result/'+text)#新建文件夹
        images=item.get('pic_ids')#获取id
        for image in images:
            try:
                response=requests.get('https://wx1.sinaimg.cn/large/'+image+'.jpg')
                #根据url获取图片
                if response.status_code==200:
                    file_path='result/{0}/{1}.{2}'.format(text,md5(response.content).hexdigest(),'jpg')
                    #保存到对应的文件夹
                if not os.path.exists(file_path):
                    with open(file_path,'wb') as f:
                        f.write(response.content)
                else:
                    print('downloaded ever',file_path)
            except requests.ConnectionError:
                print('falied')

然后写个对响应中每个blog分析的函数:

def parse_page(json):
    if json:
        items=json.get('data').get('cards')
        for item in items:
            item=item.get('mblog')
            save_image(item)

最后写主函数:

if not os.path.exists('result'):#创建工作路径下的一个子目录存取图片
    os.mkdir('result')

for page in range(1,11):#调用上述函数,获取前10个
    json=get_page(page)
    results=parse_page(json)
    for result in results:
        print(result)

run出来的结果:

?(工作目录中的result,图片都存在了对应的文件夹)

然后就完成啦!

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-09-06 11:06:03  更:2021-09-06 11:06:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 14:44:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码