练手入门级爬虫,利用requests+BeautifulSoup(美丽汤>_<)来爬取http://v2ex.com 网站上面的所有帖子,包括帖子标题,作者,时间,主要是正则表达式的学习:
#练习01:2014-10-26
#http://v2ex.com/t/\d+
#需求是获取v2ex网站上面所有的帖子标题,作者,时间
#通过观察,发现v2ex网站上面的帖子的url规律是:http://v2ex.com/t/ + 数字 【截至到写这个程序,v2ex一共有141542个帖子】
"""
if __name__ == "__main__":
for x in range(1, 5710): #一共有5710页
req_html_doc = requests.get("http://v2ex.com/recent?p=" + str(x)).text
my_soup = BeautifulSoup(req_html_doc)
#print my_soup.title, my_soup.title.name, my_soup.title.string # 依次返回<title>V2EX</title>, title, V2EX
result = my_soup.findAll('div', {'class': "cell item"}) # result是BeautifulSoup.ResultSet类型
for each in result: # 每一个each都是BeautifulSoup.Tag类型
each_table_string = str(each)
#从table中匹配出title,有些title有换行符,必须用re.DOTALL使得.也匹配换行符
reg_title = re.compile(r'<span class="item_title"><a href="(.*)">(.*)</a></span>', re.DOTALL)
tie_zi_title = reg_title.findall(each_table_string)[0][1]
reg_author = re.compile(r'align="center"><a href="/member/(.*)"><img src=')
tie_zi_author = reg_author.findall(each_table_string)[0]
#有人回复时是 </strong> • 38 \xe5\x88\x86\xe9\x92\x9f\xe5\x89\x8d • ;,
#没人回复时是</strong> • 38 \xe5\x88\x86\xe9\x92\x9f\xe5\x89\x8d</span> 返回后再正则提取
reg_date = re.compile(r'</a></strong> \xe2\x80\xa2 (.*)')
raw_tie_zi_date = reg_date.findall(each_table_string)[0]
raw_tie_zi_date = raw_tie_zi_date.rstrip('</span>')
print tie_zi_title, tie_zi_author, re.split(" \xe2\x80\xa2 ", raw_tie_zi_date)[0]
后期的结果保存没做处理,可以视情况保存到文本,CSV, 数据库中。
Comments !