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实例之wxpython中Frame使用方法
Jun 09 Python
python使用cPickle模块序列化实例
Sep 25 Python
python文件读写操作与linux shell变量命令交互执行的方法
Jan 14 Python
Python处理RSS、ATOM模块FEEDPARSER介绍
Feb 18 Python
讲解Python中运算符使用时的优先级
May 14 Python
python实现寻找最长回文子序列的方法
Jun 02 Python
python 除法保留两位小数点的方法
Jul 16 Python
python语言基本语句用法总结
Jun 11 Python
Python基础之字符串操作常用函数集合
Feb 09 Python
python删除指定列或多列单个或多个内容实例
Jun 28 Python
Django中template for如何使用方法
Jan 31 Python
python3实现无权最短路径的方法
May 12 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使用strtotime获取上个月、下个月、本月的日期
2015/12/30 PHP
wordpress网站转移到本地运行测试的方法
2017/03/15 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
2019/08/27 PHP
JavaScript 加号(+)运算符号
2009/12/06 Javascript
用JavaScript玩转游戏物理(一)运动学模拟与粒子系统
2010/06/19 Javascript
新手常遇到的一些jquery问题整理
2010/08/16 Javascript
自写的一个jQuery圆角插件
2010/10/26 Javascript
用js一次改变多个input的readonly属性值的方法
2014/06/11 Javascript
javascript实现uploadify上传格式以及个数限制
2015/11/23 Javascript
原生JS实现旋转木马式图片轮播插件
2016/04/25 Javascript
基于JS实现EOS隐藏错误提示层代码
2016/04/25 Javascript
最全面的JS倒计时代码
2016/09/17 Javascript
jQuery 插件实现随机自由弹跳气泡样式
2017/01/12 Javascript
使用JavaScript根据图片获取条形码的方法
2017/07/04 Javascript
JavaScript中Dom操作实例详解
2019/07/08 Javascript
JavaScript之Blob对象类型的具体使用方法
2019/11/29 Javascript
JavaScript 链表定义与使用方法示例
2020/04/28 Javascript
原生微信小程序开发中 redux 的使用详解
2021/02/18 Javascript
Django视图和URL配置详解
2018/01/31 Python
Python调用C++,通过Pybind11制作Python接口
2018/10/16 Python
Python查找最长不包含重复字符的子字符串算法示例
2019/02/13 Python
PyQt5 QTableView设置某一列不可编辑的方法
2019/06/25 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
2020/04/08 Python
用HTML5制作数字时钟的教程
2015/05/11 HTML / CSS
荷兰在线啤酒店:Beerwulf
2019/08/26 全球购物
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2016/01/06 面试题
什么是规则表达式
2012/05/03 面试题
餐厅经理岗位职责范本
2014/02/17 职场文书
幼儿园教师师德师风承诺书
2015/04/28 职场文书
爱心捐款活动总结
2015/05/09 职场文书
2015年学校禁毒工作总结
2015/05/27 职场文书
2015年行政管理人员工作总结
2015/10/15 职场文书
2016党校学习心得体会范文
2016/01/07 职场文书
golang的文件创建及读写操作
2022/04/14 Golang
代码复现python目标检测yolo3详解预测
2022/05/06 Python