。,。初学python,第一次尝试写文章。在跟着书和网上教程写了几个实例之后尝试自己编写一个爬虫程序,选择的爬取对象是新浪微博。由于新浪微博的PC端和移动端构造并不一样,第一篇文章采用BeautifulSoup和lxml对较为简单的微博移动端进行爬取,之后文章会分别采用selenium和PhantomJS,Scrapy框架对微博PC端和移动端进行爬取。请各位多多指教。
测试用例爬取的对象是工商大学的微博自媒体,通过对微博用户url链接的分析,我们不难看出红线勾出的数字代表的是用户的ID,程序的主要功能也就是输入用户的ID,获取到对应用户的文字和图片信息。
因为新浪微博的限制,我尝试直接爬取页面信息失败了,解决方法是在requests请求中加入对应的cookie信息,cookies信息的获取可以通过登录微博时F12查看开发者工具,
将登录时对应的cookies信息复制下来,加入到requests请求中。
输入用户的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作为一个页面文字微博的计数。
对微博图片信息爬取中,将图片链接定位好之后,我在抓取中发现直接使用源代码中的图片链接只能得到一个真*小图(如下)
。,。针对这种情况,我回到了原微博,再查看微博原图对两者的url链接进行比较
我们可以看出,原图和缩小图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的链接。
下面是代码实际运行的图片
。,。如果图片链接没有爬取成功,可以直接用打印出来的图片链接下载,下图是爬取的结果
。,。第一篇文章大概就这样了吧,不足太多,请各位不吝指教
参考文章:
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