使用python爬取指定新浪微博用户信息(一)

时间:2022-04-02 09:33:30

。,。初学python,第一次尝试写文章。在跟着书和网上教程写了几个实例之后尝试自己编写一个爬虫程序,选择的爬取对象是新浪微博。由于新浪微博的PC端和移动端构造并不一样,第一篇文章采用BeautifulSoup和lxml对较为简单的微博移动端进行爬取,之后文章会分别采用selenium和PhantomJS,Scrapy框架对微博PC端和移动端进行爬取。请各位多多指教。

测试用例爬取的对象是工商大学的微博自媒体,通过对微博用户url链接的分析,我们不难看出红线勾出的数字代表的是用户的ID,程序的主要功能也就是输入用户的ID,获取到对应用户的文字和图片信息。

使用python爬取指定新浪微博用户信息(一)

因为新浪微博的限制,我尝试直接爬取页面信息失败了,解决方法是在requests请求中加入对应的cookie信息,cookies信息的获取可以通过登录微博时F12查看开发者工具,

将登录时对应的cookies信息复制下来,加入到requests请求中。

使用python爬取指定新浪微博用户信息(一)

输入用户的ID后,构造出对应的url链接和cookies信息一起传入requests请求。

开始编写程序,我先定义了四个函数,分别为get_html(),get_comment(),get_img,main(),其中main()为主函数,其余分别是获取页面源代码信息,获取文字微博信息,获取图片信息。

 page_num = (int)(input("输入你要爬取的页数:"))
for page in range(1,page_num+1):
url = "https://weibo.cn/%d?page=%d"%(user_id,page)

这里我还定义了一个设置爬取微博页数的变量,由于一些微博用户的累计微博太多,有时并不需要全部爬取下来,所以由用户输入来决定爬取的页数。

 html = etree.HTML(lxml)
all_comments = html.xpath('//span[@class="ctt"]')
for each in all_comments:
try:
comment =str(count)+" "+ each.xpath('string(.)')+"\n\n"
text= text + comment
count+=1
except:
continue
在对微博文字信息爬取的过程中,我采用了lxml来做信息提取,用xpath选取到文字微博对应的标签,对其进行遍历,count作为一个页面文字微博的计数。

对微博图片信息爬取中,将图片链接定位好之后,我在抓取中发现直接使用源代码中的图片链接只能得到一个真*小图(如下)

使用python爬取指定新浪微博用户信息(一)

。,。针对这种情况,我回到了原微博,再查看微博原图对两者的url链接进行比较

使用python爬取指定新浪微博用户信息(一)

我们可以看出,原图和缩小图url链接的差别在于.cn/之后的变量,于是我们采用了replace方法,替换掉缩小图的wap180字符串

for i in range(len(taglist)):
try:
imgurl = taglist[i]["src"]
fpath = root + imgurl.split('/')[-1]

imgurl=imgurl.replace('wap180','large')
。,。差不多就这样吧,下面给出程序全代码

import requests
import os
import re
import traceback
from lxml import etree
from bs4 import BeautifulSoup


def get_html(url,cookies):
try:
re = requests.get(url,cookies=cookies)
re.raise_for_status
except:
return ""

return re.content



def get_comment(lxml,count):
text=""

print("开始爬取文字微博")
fpath = "D://微博爬虫.txt"
html = etree.HTML(lxml)

all_comments = html.xpath('//span[@class="ctt"]')

for each in all_comments:
# try:
comment =str(count)+" "+ each.xpath('string(.)')+"\n\n"
text= text + comment
count+=1
# except:
# continue

with open(fpath,'a',encoding="utf-8") as f:
f.write(text)
print("文字微博爬取完成")



def get_img(lxml):
root = "D://微博图片//"
print("开始爬取图片微博")
html = BeautifulSoup(lxml,"lxml")

taglist = html.find_all('img',attrs={"alt":"图片"})

for i in range(len(taglist)):
# try:
imgurl = taglist[i]["src"]

fpath = root + imgurl.split('/')[-1]

imgurl=imgurl.replace('wap180','large')
print(imgurl)
content = requests.get(imgurl).content

with open(fpath,'wb') as f:
f.write(content)
print("%d爬取成功")%imgurl
# except:
# continue



def main():
cookies={"Cookie":"#写你自己的cookies"}
user_id = (int)(input("输入你要爬取的微博id:"))
page_num = (int)(input("输入你要爬取的页数:"))

for page in range(1,page_num+1):
url = "https://weibo.cn/%d?page=%d"%(user_id,page)
count=1
print(url)
try:
lxml = get_html(url,cookies)
get_comment(lxml,count)
get_img(lxml)
except:
traceback.format_exc
continue

main()


最后还要注意一下爬取用户的微博ID链接,我自己也观察了一下,有些人的似乎用上面的url格式无法获取到,我先研究一下,如果有结果会写在后面的文章里,代码爬取出错可以尝试修改一下url的链接。

下面是代码实际运行的图片

使用python爬取指定新浪微博用户信息(一)

。,。如果图片链接没有爬取成功,可以直接用打印出来的图片链接下载,下图是爬取的结果

使用python爬取指定新浪微博用户信息(一)

使用python爬取指定新浪微博用户信息(一)

。,。第一篇文章大概就这样了吧,不足太多,请各位不吝指教


参考文章:
http://www.baidu.com/link?url=J4HFEYqdf-tNNq53Wznn_UtKCf8_88-qbk654ttqb10z-E4Rd_aiImDcha8gzGtL&wd=&eqid=ef8712c40000874100000005599aee68

http://www.baidu.com/link?url=zd020Ka3MGY_z0UrInqXzShpr5D5cQbhlBkUCKZ_PQOcyTG2bPizf7Z82MZhLoKv7ZM6zl8engtX2QxU2O_mBa&wd=&eqid=ef8712c40000874100000005599aee68

http://www.baidu.com/link?url=k9LArv_dz0-xXkjHCZ0nyWekhXycpoTXpaYlvQa3IuaGdGmPnv1RXVCGvVuaEGTOeXzKE6jGT4b_dDuUyweE6K&wd=&eqid=ef8712c40000874100000005599aee68