爬取某个微博用户的所有微博内容及照片 您所在的位置:网站首页 wap主页 爬取某个微博用户的所有微博内容及照片

爬取某个微博用户的所有微博内容及照片

2023-08-22 11:47| 来源: 网络整理| 查看: 265

因为今日头条似乎加入了反爬虫机制,所以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,图片都存在了对应的文件夹)

然后就完成啦!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有