网站调用新浪微博内容(用Python写一个简单的微博爬虫感谢我用(图))

优采云 发布时间: 2021-10-13 00:28

  网站调用新浪微博内容(用Python写一个简单的微博爬虫感谢我用(图))

  请自己回答知乎第一个回答

  作为刚刚实施新浪微博爬虫程序的小白,我觉得还是可以回答一下的。

  我的爬虫最终效果是:

  1、输入用户id,将用户所有的文字微博保存在一个.txt文件中;

  2、用户在微博上发布的图片按时间顺序存放在本地文件夹中。

  我大致参考了余良的经验:用Python写一个简单的微博爬虫。谢谢

  我用的是python3.5版本,说一下大体思路:

  准备工作: 1.先确定目标,爬社交。网站 推荐使用手机版的客户端,因为网站的PC版使用了动态加载技术。对于静态网站的习惯,对于爬虫(尤其是新爬虫)来说可能很不方便,所以我们先锁定移动端网站:/(好像是这个),嗯,就是这样. 2. 自动模拟登录微博需要用户的cookies;先手动登录一次微博,在chrome开发者工具中可以轻松捕获cookies。3.获取目标用户的id,这个很简单,以我的女神@子望为例:如图,进入目标的微博首页,红圈内的数字为id:

  

  4、下载相关的第三方库,lxml和BeautifulSoup可供以后使用。

  让我们进入正题,使用强大的工具python来接微博:

  首先确定字符格式,模拟登录微博,输入目标用户id(避免乱码)

  importlib.reload(sys)

#sys.setdefautencoding('utf-8') 在python3中已经没有该方法

默认utf-8

if(len(sys.argv)>=2):

user_id=(int)(sys.argv[1])

else:

user_id=(int)(input(u"请输入用户id"))

cookie={"Cookie":"##填写你的cookies##"}

url='http://weibo.cn/u/%d?filter=1&page=1'%user_id

  然后,借助lxml库,复制网站的原创html,计算需要爬取的页面数,如下:

  

  html = requests.get(url, cookies = cookie).content

selector = etree.HTML(html)

pageNum=(int)(selector.xpath(u'//input[@name="mp"]')[0].attrib['value'])

result="" #储存数据备用

urllist_set=set()

word_count=1

image_count=1

print(u'爬虫准备就绪...')

  最后是抓取内容并保存输出

  for page in range(1,pageNum+1):

url='http://weibo.cn/u/%d?filter=1&page=%d'%(user_id,page)

lxml=requests.get(url,cookies=cookie).content

selector=etree.HTML(lxml)

content=selector.xpath('//span[@class="ctt"]')

for each in content:

text=each.xpath('string(.)')

if word_count>=4:

text="%d:"%(word_count-3)+text+"\n\n"

else:

text=text+"\n\n"

result=result+text

word_count+=1

soup=BeautifulSoup(lxml,"lxml")

urllist=soup.find_all('a',href=re.compile(r'^http://weibo.cn/mblog/oripic',re.I))

first=0

for imgurl in urllist:

urllist_set.add(requests.get(imgurl['href'],cookies=cookie).url)

image_count+=1

fo=open(u"/Users/wanghuan/AppData/Local/Programs/Python/Python35/爬虫/%s"%user_id,"w" ,encoding='utf-8', errors='ignore')

fo.write(result)

word_path=os.getcwd()+'%d'%user_id

print(u"文字微博爬取完毕")

fo.close()

link=""

fo2=open("/Users/wanghuan/AppData/Local/Programs/Python/Python35/爬虫/%s_imageurls"%user_id,"w")

for eachlink in urllist_set:

link=link+eachlink+"\n"

fo2.write(link)

print(u'图片链接爬取完毕')

fo2.close()

if not urllist_set:

print(u'图片不存在')

else:

image_path=os.getcwd()+'\weibopicture'

if os.path.exists(image_path) is False:

os.mkdir(image_path)

x=1

for imgurl in urllist_set:

temp=image_path+'/%s.jpg'%x

print(u'正在下载第%s张图片'%x)

try:

urllib.request.urlretrieve(urllib.request.urlopen(imgurl).geturl(),temp)

except:

print(u'图片下载失败:%s'%imgurl)

x+=1

print(u'原创微博爬取完毕,共%d条,保存路径%s'%(word_count-4,word_path))

print(u'原创微博图片爬取完毕,共%d张,保存路径%s'%(image_count-1,image_path))

  在程序的根目录下,还生成了一个userid_imageurls的文本文件,里面存放着所有爬取到的图片的下载链接,方便手动下载下载失败的图片。

  然后就可以在文件夹中打开查看:

  

  

  

  我修改后的源码在这里:python-web-spider/新浪微博在master上爬取最终版·RobortHuan/python-web-spider·GitHub

  最后总结一下,lxml还是好用的。可以直接抓取html直接分析网页源码;此外,没有大量使用正则表达式;速度据说比urllib快很多,最好用python做爬虫。简单的。

  第一次认真回答问题,时间比较短,有些没有说清楚,布局也没有安排好,还望见谅,欢迎大家指正!

  以上!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线