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 获取et和excel的版本号
Apr 09 Python
python中MySQLdb模块用法实例
Nov 10 Python
Windows平台Python连接sqlite3数据库的方法分析
Jul 12 Python
Python爬虫之xlml解析库(全面了解)
Aug 08 Python
pandas值替换方法
Jul 10 Python
python中正则表达式与模式匹配
May 07 Python
Python如何避免文件同名产生覆盖
Jun 09 Python
使用已经得到的keras模型识别自己手写的数字方式
Jun 29 Python
Python venv虚拟环境配置过程解析
Jul 08 Python
彻底搞懂python 迭代器和生成器
Sep 07 Python
Python urllib库如何添加headers过程解析
Oct 05 Python
PyTorch 中的傅里叶卷积实现示例
Dec 11 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
将OICQ数据转成MYSQL数据
2006/10/09 PHP
php解析html类库simple_html_dom(详细介绍)
2013/07/05 PHP
codeigniter中测试通过的分页类示例
2014/04/17 PHP
ThinkPHP表单数据智能写入create方法实例分析
2015/09/27 PHP
php用xpath解析html的代码实例讲解
2019/02/14 PHP
javascript while语句和do while语句的区别分析
2007/12/08 Javascript
Javascript实现滚动图片新闻的实例代码
2013/11/27 Javascript
JS弹出层的显示与隐藏示例代码
2013/12/27 Javascript
解析jQuery的三种bind/One/Live事件绑定使用方法
2013/12/30 Javascript
javascript常用方法汇总
2014/12/02 Javascript
JS实现单行文字不间断向上滚动的方法
2015/01/29 Javascript
javascript内置对象操作详解
2015/02/04 Javascript
jQuery实现自动切换播放的经典滑动门效果
2015/09/12 Javascript
JavaScript优化专题之Loading and Execution加载和运行
2016/01/20 Javascript
WebSocket+node.js创建即时通信的Web聊天服务器
2016/08/08 Javascript
jquery表单插件form使用方法详解
2017/01/20 Javascript
JS组件系列之MVVM组件 vue 30分钟搞定前端增删改查
2017/04/28 Javascript
使用travis-ci如何持续部署node.js应用详解
2017/07/30 Javascript
vue项目在安卓低版本机显示空白的原因分析(两种)
2018/09/04 Javascript
Webstorm2016使用技巧(SVN插件使用)
2018/10/29 Javascript
微信小程序canvas绘制圆角base64图片的实现
2019/08/18 Javascript
微信小程序去除左上角返回键的实现方法
2020/03/06 Javascript
vue中使用v-for时为什么不能用index作为key
2020/04/04 Javascript
解决vue cli4升级sass-loader(v8)后报错问题
2020/07/30 Javascript
从零开始学Python第八周:详解网络编程基础(socket)
2016/12/14 Python
对python 自定义协议的方法详解
2019/02/13 Python
利用python开发app实战的方法
2019/07/09 Python
详解CSS3中Media Queries的相关使用
2015/07/17 HTML / CSS
HTML5语音识别标签写法附图
2013/11/18 HTML / CSS
给领导的致歉信范文
2014/01/13 职场文书
服务员自我评价
2014/01/25 职场文书
主持人婚宴答谢词
2014/01/28 职场文书
企业安全生产月活动总结
2014/07/05 职场文书
房屋买卖委托书格式范本格式
2014/10/13 职场文书
2016三八妇女节校园广播稿
2015/12/17 职场文书
详解Python常用的魔法方法
2021/06/03 Python