requests+BeautifulSoup爬取V2EX.COM网站所有帖子

练手入门级爬虫,利用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> &nbsp;•&nbsp; 38 \xe5\x88\x86\xe9\x92\x9f\xe5\x89\x8d &nbsp;•&nbsp;;,
            #没人回复时是</strong> &nbsp;•&nbsp; 38 \xe5\x88\x86\xe9\x92\x9f\xe5\x89\x8d</span> 返回后再正则提取
            reg_date = re.compile(r'</a></strong> &nbsp;\xe2\x80\xa2&nbsp;(.*)')
            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("&nbsp;\xe2\x80\xa2&nbsp;", raw_tie_zi_date)[0]

后期的结果保存没做处理,可以视情况保存到文本,CSV, 数据库中。

Comments !