python多线程抓取天涯帖子内容示例


Posted in Python onApril 03, 2014

使用re, urllib, threading 多线程抓取天涯帖子内容,设置url为需抓取的天涯帖子的第一页,设置file_name为下载后的文件名

#coding:utf-8
import urllib
import re
import threading
import os, time
class Down_Tianya(threading.Thread):
    """多线程下载"""
    def __init__(self, url, num, dt):
        threading.Thread.__init__(self)
        self.url = url
        self.num = num
        self.txt_dict = dt
    def run(self):
        print 'downling from %s' % self.url
        self.down_text()
    def down_text(self):
        """根据传入的url抓出各页内容,按页数做键存入字典"""
        html_content =urllib.urlopen(self.url).read()
        text_pattern = re.compile('<span>时间:(.*?)</span>.*?<!-- <div class="host-ico">楼主</div> -->.*?<div class="bbs-content.*?>\s*(.*?)</div>', re.DOTALL)
        text = text_pattern.findall(html_content)
        text_join = ['\r\n\r\n\r\n\r\n'.join(item) for item in text]
        self.txt_dict[self.num] = text_join
 

def page(url):
    """根据第一页地址抓取总页数"""
    html_page = urllib.urlopen(url).read()
    page_pattern = re.compile(r'<a href="\S*?">(\d*)</a>\s*<a href="\S*?" class="\S*?">下页</a>')
    page_result = page_pattern.search(html_page)
    if page_result:
        page_num = int(page_result.group(1))
        return page_num
 
def write_text(dict, fn):
    """把字典内容按键(页数)写入文本,每个键值为每页内容的list列表"""
    tx_file = open(fn, 'w+')
    pn = len(dict)
    for i in range(1, pn+1):
        tx_list = dict[i]
        for tx in tx_list:
            tx = tx.replace('<br>', '\r\n').replace('<br />', '\r\n').replace(' ', '')
            tx_file.write(tx.strip()+'\r\n'*4)
    tx_file.close()

def main():
    url = 'http://bbs.tianya.cn/post-16-996521-1.shtml'
    file_name ='abc.txt'
    my_page = page(url)
    my_dict = {}
    print 'page num is : %s' % my_page
    threads = []
    """根据页数构造urls进行多线程下载"""
    for num in range(1, my_page+1):
        myurl = '%s%s.shtml' % (url[:-7], num)
        downlist = Down_Tianya(myurl, num, my_dict)
        downlist.start()
        threads.append(downlist)
    """检查下载完成后再进行写入"""
    for t in threads:
        t.join()
    write_text(my_dict, file_name)
    print 'All download finished. Save file at directory: %s' % os.getcwd()
if __name__ == '__main__':
    main()

down_tianya.py

#coding:utf-8
import urllib
import re
import threading
import os
class Down_Tianya(threading.Thread):
    """多线程下载"""
    def __init__(self, url, num, dt):
        threading.Thread.__init__(self)
        self.url = url
        self.num = num
        self.txt_dict = dt
    def run(self):
        print 'downling from %s' % self.url
        self.down_text()
    def down_text(self):
        """根据传入的url抓出各页内容,按页数做键存入字典"""
        html_content =urllib.urlopen(self.url).read()
        text_pattern = re.compile('<div class="atl-item".*?<span>时间:(.*?)</span>.*?<!-- <div class="host-ico">楼主</div> -->.*?<div class="bbs-content.*?>\s*(.*?)</div>', re.DOTALL)
        text = text_pattern.findall(html_content)
        text_join = ['\r\n\r\n\r\n\r\n'.join(item) for item in text]
        self.txt_dict[self.num] = text_join
 

def page(url):
    """根据第一页地址抓取总页数"""
    html_page = urllib.urlopen(url).read()
    page_pattern = re.compile(r'<a href="\S*?">(\d*)</a>\s*<a href="\S*?" class="\S*?">下页</a>')
    page_result = page_pattern.search(html_page)
    if page_result:
        page_num = int(page_result.group(1))
        return page_num
 
def write_text(dict, fn):
    """把字典内容按键(页数)写入文本,每个键值为每页内容的list列表"""
    tx_file = open(fn, 'w+')
    pn = len(dict)
    for i in range(1, pn+1):
        tx_list = dict[i]
        for tx in tx_list:
            tx = tx.replace('<br>', '\r\n').replace('<br />', '\r\n').replace(' ', '')
            tx_file.write(tx.strip()+'\r\n'*4)
    tx_file.close()

def main():
    url = 'http://bbs.tianya.cn/post-16-996521-1.shtml'
    file_name ='abc.txt'
    my_page = page(url)
    my_dict = {}
    print 'page num is : %s' % my_page
    threads = []
    """根据页数构造urls进行多线程下载"""
    for num in range(1, my_page+1):
        myurl = '%s%s.shtml' % (url[:-7], num)
        downlist = Down_Tianya(myurl, num, my_dict)
        downlist.start()
        threads.append(downlist)
    """检查下载完成后再进行写入"""
    for t in threads:
        t.join()
    write_text(my_dict, file_name)
    print 'All download finished. Save file at directory: %s' % os.getcwd()
if __name__ == '__main__':
    main()
Python 相关文章推荐
跟老齐学Python之??碌某?? target=
Sep 12 Python
浅谈python对象数据的读写权限
Sep 12 Python
Python3的urllib.parse常用函数小结(urlencode,quote,quote_plus,unquote,unquote_plus等)
Sep 18 Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
Aug 01 Python
Python中使用pypdf2合并、分割、加密pdf文件的代码详解
May 21 Python
Django网络框架之HelloDjango项目创建教程
Jun 06 Python
python使用tomorrow实现多线程的例子
Jul 20 Python
Python学习笔记之For循环用法详解
Aug 14 Python
nginx搭建基于python的web环境的实现步骤
Jan 03 Python
Python Socket TCP双端聊天功能实现过程详解
Jun 15 Python
python3.9和pycharm的安装教程并创建简单项目的步骤
Feb 03 Python
Python实现单例模式的5种方法
Jun 15 Python
python局域网ip扫描示例分享
Apr 03 #Python
python实现数通设备tftp备份配置文件示例
Apr 02 #Python
python实现巡检系统(solaris)示例
Apr 02 #Python
python实现apahce网站日志分析示例
Apr 02 #Python
python实现数通设备端口监控示例
Apr 02 #Python
使用python解析xml成对应的html示例分享
Apr 02 #Python
Python爬虫框架Scrapy安装使用步骤
Apr 01 #Python
You might like
php正则匹配html中带class的div并选取其中内容的方法
2015/01/13 PHP
php实现批量修改文件名称的方法
2016/07/23 PHP
IE和Mozilla的兼容性汇总event
2007/08/12 Javascript
用Jquery实现多级下拉框无刷新的联动
2010/12/22 Javascript
JavaScript判断textarea值是否为空并给出相应提示
2014/09/04 Javascript
使用AngularJS制作一个简单的RSS阅读器的教程
2015/06/18 Javascript
javascript常用功能汇总
2015/07/05 Javascript
浅谈JS继承_寄生式继承 &amp; 寄生组合式继承
2016/08/16 Javascript
浅谈vue引入css,less遇到的坑和解决方法
2018/01/20 Javascript
Vue中v-for的数据分组实例
2018/03/07 Javascript
vue 搭建后台系统模块化开发详解
2019/05/01 Javascript
安装多版本Vue-CLI的实现方法
2020/03/24 Javascript
[01:00:49]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第二场 1月31日
2021/03/11 DOTA
python列出目录下指定文件与子目录的方法
2015/07/03 Python
Python+selenium实现截图图片并保存截取的图片
2018/01/05 Python
Python使用matplotlib实现绘制自定义图形功能示例
2018/01/18 Python
django url到views参数传递的实例
2019/07/19 Python
简单了解python gevent 协程使用及作用
2019/07/22 Python
python自动化UI工具发送QQ消息的实例
2019/08/27 Python
python BlockingScheduler定时任务及其他方式的实现
2019/09/19 Python
Python迭代器协议及for循环工作机制详解
2020/07/14 Python
H5离线存储Manifest原理及使用
2020/04/28 HTML / CSS
德国高尔夫商店:Golfshop.de
2019/06/22 全球购物
本科生学习总结的自我评价
2013/10/02 职场文书
文秘专业大学生求职信
2013/11/10 职场文书
业务总经理岗位职责
2014/02/03 职场文书
《在山的那边》教学反思
2014/02/23 职场文书
企业精细化管理实施方案
2014/03/23 职场文书
合作协议书范文
2014/08/20 职场文书
安全生产标语大全
2014/10/06 职场文书
教师批评与自我批评(群众路线)
2014/10/15 职场文书
检讨书范文300字
2015/01/28 职场文书
2015年计划生育协会工作总结
2015/05/13 职场文书
2019毕业典礼主持词!
2019/07/05 职场文书
Java SSM配置文件案例详解
2021/08/30 Java/Android
前端监听websocket消息并实时弹出(实例代码)
2021/11/27 Javascript