如何结合正则爬取页面信息?第二种方法是什么?

05-20 425阅读 0评论
小熊猫权益

温馨提示:这篇文章已超过124天没有更新,请注意相关的内容是否还可用!

纯php博客源码_php个人博客源码_个人博客网站源码php

新浪微博数据的爬取主要有两种方式,当然也可以说博主只了解这两种方式,一种是使用新浪API获得,另一种是结合正则直接爬取页面信息。第一种方式仍然官方封装甚好,给出的数据也非常丰富,但说究竟还是限制太多,很多接口只能获得当前登录客户的信息,无法获得好友的信息(你若不信,可以实践一下),所以在爬取数据的过程中干脆放弃了。本文主要介绍第二种方式,即怎样结合正则爬取页面信息。

登录微博

首先是登录微博,博主使用的是(也许你也可以使用),说明一下,有关爬取的相关代码,都写在这个类中php个人博客源码,login方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

#使用urllib2模拟登录过程
def login(self, username=None, password=None):
   self.status = False #重新将登录状态设置为False
   self.logger.info("Start to login...")
   #根据用户名和密码给默认参数赋值,并初始化post_data
   self.setAccount(username, password)
   self.setPostData()
   self.enableCookie()
   #登录时请求的url
   login_url = r'https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)'
   headers = self.headers
   request = urllib2.Request(login_url, urllib.urlencode(self.post_data), headers)
   resText = urllib2.urlopen(request).read()
   try:        
       jsonText = json.loads(resText)
       if jsonText["retcode"] == "0":
           self.logger.info("Login success!")
           self.status = True
           #将cookie加入到headers中
           cookies = ';'.join([cookie.name + "=" + cookie.value for cookie in self.cookiejar])
           headers["Cookie"] = cookies
       else:
           self.logger.error("Login Failed --> " + jsonText["reason"])
   except Exception, e:
       print e
       self.logger.info("Login Failed2!")
   self.headers = headers
   return self

后面用到了几个步骤,与当时的模拟新浪微博登录:从原理预测到实现这篇博文的源码类似,可以参考模拟登陆新浪的源码。本文的完整源码,待后续整理完整后,也会在该的仓库中给出。

登录以后,就可以进行数据爬取了。

获得用户个人信息

为了方便,博主将请求ULR的内容写在了方式里,该办法返回的是该url链接的例程,代码如下:

1
2
3
4
5

#打开url时携带headers,此header需携带cookies
def openURL(self, url, data=None):
   req = urllib2.Request(url, data=data, headers=self.headers)
   text = urllib2.urlopen(req).read()
   return text

爬取用户个人信息时,为了受到更多的信息,我们需请求多个地址,博主在爬取时访问了如下四个:

=“%s/info“%uid

=“%s“%uid

=“%s/info“%uid

=“%s“%uid

温馨提示:%uid是网易微博用户ID,若想查看四个页面的信息,将%s替换成用户ID即可。比如将中的uid赋值为,则网址为。

在上述网址中,从中可以受到昵称、性别、地区、生日、简介、性取向、婚姻状态、首页链接八个字段;从中可以受到用户的关注量、粉丝量、微博量;从中可以获得客户的注册日期;从中则可以受到用户的标签信息。将这种信息合并到一起,加上uidphp个人博客源码,共可得14个字段。爬取过程中有的数组取值因客户没填写而导致结果不存在,为了统一字段数量,我们将这种不存在的字段统一置为空串。请求一个页面时,我们可以将页面的源码保存下来,然后使用进行解读,再结合正则找到需要的数组值。整个代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

from bs4 import BeautifulSoup as BS
def getUserInfos(self, uid):
   url_app = "http://weibo.cn/%s/info" %uid
   text_app = self.openURL(url_app)
   soup_app = unicode(BS(text_app, "html.parser"))
   nickname = re.findall(u'\u6635\u79f0[:|\uff1a](.*?)    gender = re.findall(u'\u6027\u522b[:|\uff1a](.*?)    address = re.findall(u'\u5730\u533a[:|\uff1a](.*?)    birthday = re.findall(u'\u751f\u65e5[:|\uff1a](.*?)    desc = re.findall(u'\u7b80\u4ecb[:|\uff1a](.*?)    sexorientation = re.findall(u'\u6027\u53d6\u5411[:|\uff1a](.*?)    marriage = re.findall(u'\u611f\u60c5\u72b6\u51b5[:|\uff1a](.*?)    homepage = re.findall(u'\u4e92\u8054\u7f51[:|\uff1a](.*?)    #根据app主页获取数据
   app_page = "http://weibo.cn/%s" %uid
   text_homepage = self.openURL(app_page)
   soup_home = unicode(BS(text_homepage, "html.parser"))
   tweets_count = re.findall(u'\u5fae\u535a\[(\d+)\]', soup_home)
   follows_count = re.findall(u'\u5173\u6ce8\[(\d+)\]', soup_home)
   fans_count = re.findall(u'\u7c89\u4e1d\[(\d+)\]', soup_home)
   #根据web用户详情页获取注册日期
   url_web = "http://weibo.com/%s/info" %uid
   text_web = self.openURL(url_web)
   reg_date = re.findall(r"\d{4}-\d{2}-\d{2}", text_web)
   #根据标签详情页获取标签        
   tag_url = "http://weibo.cn/account/privacy/tags/?uid=%s" %uid
   text_tag = self.openURL(tag_url)      
   soup_tag = BS(text_tag, "html.parser")
   res = soup_tag.find_all('div', {"class":"c"})
   tags = "|".join([elem.text for elem in res[2].find_all("a")])
   
   #将用户信息合并        
   userinfo = {}
   userinfo["uid"] = uid
   userinfo["nickname"] = nickname[0] if nickname else ""
   userinfo["gender"] = gender[0] if gender else ""
   userinfo["address"] = address[0] if address else ""
   userinfo["birthday"] = birthday[0] if birthday else ""
   userinfo["desc"] = desc[0] if desc else ""
   userinfo["sex_orientation"] = sexorientation[0] if sexorientation else ""
   userinfo["marriage"] = marriage[0] if marriage else ""
   userinfo["homepage"] = homepage[0] if homepage else ""
   userinfo["tweets_count"] = tweets_count[0] if tweets_count else "0"
   userinfo["follows_count"] = follows_count[0] if follows_count else "0"
   userinfo["fans_count"] = fans_count[0] if fans_count else "0"
   userinfo["reg_date"] = reg_date[0] if reg_date else ""
   userinfo["tags"] = tags if tags else ""
   return userinfo

上述方式传入的只有一个用户IDuid,最终返回的是一个dict,也就是json串。之所以以JSON串返回是由于这会便于我们后续的数据处理,比如内存至本地以及读取到数据库中。结果字段值如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14

uid:用户ID
nickname:昵称
address:地址
sex:性别
birthday:生日
desc:简介
marriage:婚姻状况
follows_count:关注数
fans_count:粉丝数
tweets_count:微博数
homepage:首页链接
reg_date:注册时间
tag:标签
sex_orientation:性取向

实例

运行代码后,最终的结果将以JSON串返回,传入uid为的参数,返回结果如下:

现在只包括这14个字段,如果必须更多的信息,可去新浪微博网址中认真查看相关字段,然后将想要的信息加入到中就能。在后续博文中,将给出用户粉丝爬取、用户关注爬取、用户微博爬取等相关信息,敬请期待!

End.

本文来自网络,如有侵权请联系网站客服进行删除

如何结合正则爬取页面信息?第二种方法是什么?  您阅读本篇文章共花了: 

  • 1.注意:本站资源多为网络收集,如涉及版权问题请及时与站长联系,我们会在第一时间内删除资源。
  • 2.您购买的只是资源,不提供解答疑问和安装服务。免费源码里的接口不保证一直可以用
  • 3.本站用户发帖仅代表本站用户个人观点,并不代表本站赞同其观点和对其真实性负责。
  • 4.本站资源大多存储在云盘,如发现链接失效,请及时与站长联系,我们会第一时间更新。
  • 5.转载本网站任何内容,请按照转载方式正确书写本站原文地址
  • 6.如果发现侵权可以联系站长删除站长QQ3326096692或者邮箱通知3326096692@qq.com
  • 小熊猫权益

    发表评论

    快捷回复: 表情:
    评论列表 (暂无评论,425人围观)

    还没有评论,来说两句吧...

    目录[+]

    取消
    微信二维码
    微信二维码
    支付宝二维码
    请先 登录 再评论,若不是会员请先 注册