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

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

。,。初学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