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即时网络爬虫项目启动说明详解
Feb 23 Python
浅谈Python Opencv中gamma变换的使用详解
Apr 02 Python
django 修改server端口号的方法
May 14 Python
win7+Python3.5下scrapy的安装方法
Jul 31 Python
解决新django中的path不能使用正则表达式的问题
Dec 18 Python
对python条件表达式的四种实现方法小结
Jan 30 Python
Pandas分组与排序的实现
Jul 23 Python
Django框架组成结构、基本概念与文件功能分析
Jul 30 Python
Python绘制二维曲线的日常应用详解
Dec 04 Python
Django 项目通过加载不同env文件来区分不同环境
Feb 17 Python
Python实现删除某列中含有空值的行的示例代码
Jul 20 Python
Python 里最强的地图绘制神器
Mar 01 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在特殊字符前加斜杠的实现代码
2011/07/17 PHP
PHP在innodb引擎下快速代建全文搜索功能简明教程【基于xunsearch】
2016/10/14 PHP
浅谈PHP错误类型及屏蔽方法
2017/05/27 PHP
php使用pecl方式安装扩展操作示例
2019/08/12 PHP
跨域表单提交状态的变相判断代码
2009/11/12 Javascript
jQuery第三课 修改元素属性及内容的代码
2010/03/14 Javascript
js URL参数的拼接方法比较
2012/02/15 Javascript
Bootstrop实现多级下拉菜单功能
2016/11/24 Javascript
深入理解Javascript中的作用域链和闭包
2017/04/25 Javascript
JavaScript读写二进制数据的方法详解
2018/09/09 Javascript
微信小程序开发问题之wx.previewImage
2018/12/25 Javascript
详解vue-element Tree树形控件填坑路
2019/03/26 Javascript
[00:35]DOTA2上海特级锦标赛 VP战队宣传片
2016/03/04 DOTA
[01:06]DOTA2亚洲邀请赛专属珍藏-荧煌之礼
2017/03/24 DOTA
Python中的面向对象编程详解(上)
2015/04/13 Python
Django的session中对于用户验证的支持
2015/07/23 Python
Python通过调用mysql存储过程实现更新数据功能示例
2018/04/03 Python
python处理两种分隔符的数据集方法
2018/12/12 Python
python 实现一次性在文件中写入多行的方法
2019/01/28 Python
Python实现合并两个有序链表的方法示例
2019/01/31 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
2019/06/26 Python
python入门之基础语法学习笔记
2020/02/08 Python
python检查目录文件权限并修改目录文件权限的操作
2020/03/11 Python
django admin管理工具自定义时间区间筛选器DateRangeFilter介绍
2020/05/19 Python
Spring @Enable模块驱动原理及使用实例
2020/06/23 Python
Python中logging日志的四个等级和使用
2020/11/17 Python
python中的时区问题
2021/01/14 Python
JNI的定义
2012/11/25 面试题
网络编程中设计并发服务器,使用多进程与多线程,请问有什么区别?
2016/03/27 面试题
中专自我鉴定范文
2013/10/16 职场文书
便利店促销方案
2014/02/20 职场文书
办公经费申请报告
2015/05/15 职场文书
诚信教育主题班会
2015/08/13 职场文书
初中语文教师研修日志
2015/11/13 职场文书
2019入党申请书格式
2019/06/25 职场文书
python not运算符的实例用法
2021/06/30 Python