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的正则表达式re模块的常用方法
Mar 09 Python
python 随机数使用方法,推导以及字符串,双色球小程序实例
Sep 12 Python
python抓取网页中链接的静态图片
Jan 29 Python
python ipset管理 增删白名单的方法
Jan 14 Python
Python实现连接MySql数据库及增删改查操作详解
Apr 16 Python
使用python将多个excel文件合并到同一个文件的方法
Jul 09 Python
python中如何实现将数据分成训练集与测试集的方法
Sep 13 Python
Python Json数据文件操作原理解析
May 09 Python
Python新手如何理解循环加载模块
May 29 Python
.img/.hdr格式转.nii格式的操作
Jul 01 Python
Python爬虫爬取有道实现翻译功能
Nov 27 Python
python regex库实例用法总结
Jan 03 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
真正面向对象编程:PHP5.01发布
2006/10/09 PHP
PHP文章采集URL补全函数(FormatUrl)
2012/08/02 PHP
Thinkphp中import的几个用法详细介绍
2014/07/02 PHP
Win7下手动安装apache2.2、php5.4笔记
2015/04/03 PHP
完美解决thinkphp唯一索引重复时出错的问题
2017/03/31 PHP
php 使用curl模拟ip和来源进行访问的实现方法
2017/05/02 PHP
Yii框架where查询用法实例分析
2019/10/22 PHP
如何实现浏览器上的右键菜单
2006/07/10 Javascript
JavaScript基础知识之数据类型
2012/08/06 Javascript
node.js中的fs.open方法使用说明
2014/12/17 Javascript
jQuery实现伸展与合拢panel的方法
2015/04/30 Javascript
jQuery鼠标经过方形图片切换成圆边效果代码分享
2015/08/20 Javascript
Three.js获取鼠标点击的三维坐标示例代码
2017/03/24 Javascript
ES6入门教程之let和const命令详解
2017/05/17 Javascript
vue Render中slots的使用的实例代码
2017/07/19 Javascript
JS实现问卷星自动填问卷脚本并在两秒自动提交功能
2020/06/17 Javascript
解决Vue 通过下表修改数组,页面不渲染的问题
2018/03/08 Javascript
vue中的$emit 与$on父子组件与兄弟组件的之间通信方式
2018/05/13 Javascript
koa socket即时通讯的示例代码
2018/09/07 Javascript
js实现移动端tab切换时下划线滑动效果
2019/09/08 Javascript
利用webpack理解CommonJS和ES Modules的差异区别
2020/06/16 Javascript
python下函数参数的传递(参数带星号的说明)
2010/09/19 Python
Pandas 同元素多列去重的实例
2018/07/03 Python
python正则表达式去除两个特殊字符间的内容方法
2018/12/24 Python
有关pycharm登录github时有的时候会报错connection reset的问题
2020/09/15 Python
Python Process创建进程的2种方法详解
2021/01/25 Python
Luxplus荷兰:以会员价购买美容产品等,独家优惠
2019/08/30 全球购物
什么是典型的软件三层结构?软件设计为什么要分层?软件分层有什么好处?
2012/03/14 面试题
优秀团员个人的自我评价
2013/10/02 职场文书
清扬洗发水广告词
2014/03/14 职场文书
幼儿园迎国庆65周年活动策划方案
2014/09/16 职场文书
2014校长四风问题对照检查材料思想汇报
2014/09/16 职场文书
学校党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
Vue-Element-Admin集成自己的接口实现登录跳转
2021/06/23 Vue.js
MySQL系列之六 用户与授权
2021/07/02 MySQL
python字符串拼接.join()和拆分.split()详解
2021/11/23 Python