文章目录
1前言
学了一段时间Python了,总结了相关的基础知识,所以想实践一下,看看成果如何。
如下图所示,实现了一个糗事百科网页爬虫
可以下载该[Demo APK](https://raw.githubusercontent.com/zxlworking/MyApplication_in_desaysv/master/test_qsbk/test_qsbk-debug.apk" Demo APK")使用
2获取网页内容
2.1构造请求头
模拟用户通过浏览器访问请求
user_agent = "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)"
headers = {"User-Agent":user_agent}
2.2Http请求数据
通过urllib2设置请求糗事百科某一页的数据
try:
url = "http://www.qiushibaike.com/hot/page/%s" % page
request = urllib2.Request(url, headers=headers)
response = urllib2.urlopen(request)
return response.read().decode("utf-8")
except urllib2.URLError, e:
if hasattr(e, "code"):
print "e.code:" + e.code
if hasattr(e, "reason"):
print "e.reason:" + e.reason
3准备正则表达式
3.1解析当前页所有用户发布的糗事
依次为:用户ID、用户头像、用户昵称、用户信息、糗事内容、糗事图片、感觉好笑的人数、评论人数
def parse_qsbk_list(self, qsbk_list):
pattern = re.compile(
u"""<div class="article block untagged.*?id='(.*?)'.*?<div class="author clearfix">.*?<img.*?src="(.*?)".*?alt="(.*?)">(.*?)
<div class="content">.*?<span>(.*?)</span>
.*?<!-- 图片或gif -->(.*?)<div class="stats">(.*?)<div id="qiushi_counts.*?""",
re.S)
return re.findall(pattern, qsbk_list)
3.2解析用户是否为匿名用户
在用户信息中判断是否被注释了,如果注释了则表示匿名用户
def parse_qsbk_anonymity(self, qsbk_anonymity):
return re.findall("<!--.*?-->", qsbk_anonymity)
3.3解析用户的性别、年龄
依次为***性别、年龄***
def parse_qsbk_author_sex_age(self, qsbk_author_sex_age):
return re.findall("<div class=\"(.*?)\">(\d+)</div>", qsbk_author_sex_age)
3.4解析糗事内容是否包含图片
解析糗事内容中是否有img标签
def parse_qsbk_thumb(self, qsbk_thumb):
return re.findall("<img src=\"(.*?)\" alt=.*?>", qsbk_thumb)
3.5解析好笑的人数、评论人数
依次为:好笑的人数、评论人数
def parse_qsbk_vote_comment(self, qsbk_vote_comment):
return re.findall(u"<span class=\"stats-vote\"><i class=\"number\">(\d+)</i> 好笑</span>.*?\n.*?\n.*?\n.*?\n<i class=\"number\">(\d+)</i> 评论", qsbk_vote_comment)
3.6创建json数据结构
每一个糗事内容用字典结构mQsbkParseElement 表示,其中每一个属性用键值对方式赋值,然后放入列表mQsbkParseEleements,最后通过json.dumps转换成json数据
mQsbkParseEleements = []
mQsbkParseElement = {}
mQsbkParseElement["author_id"] = re.findall("\d+", qsbk_element[0])[0]
mQsbkParseElement["author_head_img"] = "http:" + qsbk_element[1]
mQsbkParseElement["author_name"] = qsbk_element[2]
mQsbkParseElement["is_anonymity"] = 1
mQsbkParseElement["author_sex"] = SEX_MAN
mQsbkParseElement["author_age"] = 0
mQsbkParseElement["content"] = qsbk_content
mQsbkParseElement["has_thumb"] = 1
mQsbkParseElement["thumb"] = "http:" + qsbk_thumb[0]
mQsbkParseElement["vote_number"] = int(qsbk_vote_comment[0][0])
mQsbkParseElement["comment_number"] = int(qsbk_vote_comment[0][1])
mQsbkParseEleements.append(mQsbkParseElement)
result["code"] = 0
result["desc"] = "success"
result["current_page"] = page
result["result"] = mQsbkParseEleements
json.dumps(result, encoding="utf-8", ensure_ascii=False)
PS:糗事内容详情进行类似处理