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使用os模块的os.walk遍历文件夹示例
Jan 27 Python
使用FastCGI部署Python的Django应用的教程
Jul 22 Python
利用python批量检查网站的可用性
Sep 09 Python
python中安装模块包版本冲突问题的解决
May 02 Python
Python3安装Scrapy的方法步骤
Nov 23 Python
Python网络爬虫神器PyQuery的基本使用教程
Feb 03 Python
Python向MySQL批量插数据的实例讲解
Mar 31 Python
Python实现蒙特卡洛算法小实验过程详解
Jul 12 Python
pycharm 2018 激活码及破解补丁激活方式
Sep 21 Python
Python如何解除一个装饰器
Aug 07 Python
Kmeans均值聚类算法原理以及Python如何实现
Sep 26 Python
python 基于DDT实现数据驱动测试
Feb 18 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 XML操作类DOMDocument
2009/12/16 PHP
PHP输出当前进程所有变量/常量/模块/函数/类的示例
2013/11/07 PHP
PHP实现简单ajax Loading加载功能示例
2016/12/28 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
PHP实现简单登录界面
2019/10/23 PHP
ppk谈JavaScript style属性
2008/10/10 Javascript
用jQuery打造TabPanel效果代码
2010/05/22 Javascript
使用JavaScript构建JSON格式字符串实现步骤
2013/03/22 Javascript
js读取被点击次数的简单实例(从数据库中读取)
2014/03/07 Javascript
JS的encodeURI和java的URLDecoder.decode使用介绍
2014/05/08 Javascript
javascript实现禁止复制网页内容汇总
2015/12/30 Javascript
详解如何在React组件“外”使用父组件的Props
2018/01/12 Javascript
详解Angular路由之路由守卫
2018/05/10 Javascript
Vue 表情包输入组件的实现代码
2019/01/21 Javascript
实例分析编写vue组件方法
2019/02/12 Javascript
koa-router路由参数和前端路由的结合详解
2019/05/19 Javascript
发布订阅模式在vue中的实际运用实例详解
2019/06/09 Javascript
countUp.js实现数字滚动效果
2019/10/18 Javascript
windows下python安装paramiko模块和pycrypto模块(简单三步)
2017/07/06 Python
Python实现的弹球小游戏示例
2017/08/01 Python
python实现自主查询实时天气
2018/06/22 Python
Django中如何使用sass的方法步骤
2019/07/09 Python
python使用原始套接字发送二层包(链路层帧)的方法
2019/07/22 Python
python对常见数据类型的遍历解析
2019/08/27 Python
缓解脚、腿和背部疼痛:Z-CoiL鞋
2019/03/12 全球购物
如何将一个描述日期或日期/时间的字符串转换为一个Date对象
2015/10/13 面试题
办公室文员工作职责
2014/01/31 职场文书
大学生校园创业计划书
2014/02/08 职场文书
小学节能减排倡议书
2014/05/15 职场文书
护士优质服务演讲稿
2014/08/26 职场文书
作风建设年活动总结
2014/08/27 职场文书
企业党的群众路线教育实践活动学习心得体会
2014/10/31 职场文书
商务考察邀请函模板
2015/02/02 职场文书
使用Vue3+Vant组件实现App搜索历史记录功能(示例代码)
2021/06/09 Vue.js
英国数字版游戏销量周榜公布 《小缇娜的奇幻之地》登顶
2022/04/03 其他游戏
redis protocol通信协议及使用详解
2022/07/15 Redis