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 相关文章推荐
天翼开放平台免费短信验证码接口使用实例
Dec 18 Python
详解Python各大聊天系统的屏蔽脏话功能原理
Dec 01 Python
Python进程间通信之共享内存详解
Oct 30 Python
python解决pandas处理缺失值为空字符串的问题
Apr 08 Python
PyQt4实现下拉菜单可供选择并打印出来
Apr 20 Python
Python 实现域名解析为ip的方法
Feb 14 Python
人工神经网络算法知识点总结
Jun 11 Python
Python3环境安装Scrapy爬虫框架过程及常见错误
Jul 12 Python
django mysql数据库及图片上传接口详解
Jul 18 Python
利用setuptools打包python程序的方法步骤
Jan 18 Python
OpenCV图片漫画效果的实现示例
Aug 18 Python
python实现双向链表原理
May 25 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/04/17 PHP
PHP数组实例总结与说明
2011/08/23 PHP
详解php中空字符串和0之间的关系
2016/10/23 PHP
左侧是表头的JS表格控件(自写,网上没有的)
2013/06/04 Javascript
javascript和HTML5利用canvas构建猜牌游戏实现算法
2013/07/17 Javascript
jquery中常用的函数和属性详细解析
2014/03/07 Javascript
jQuery简易图片放大特效示例代码
2014/06/09 Javascript
原生js仿jq判断当前浏览器是否为ie,精确到ie6~8
2014/08/30 Javascript
node.js中的fs.open方法使用说明
2014/12/17 Javascript
javascript运动详解
2015/07/06 Javascript
JavaScript判断变量是否为数组的方法(Array)
2016/02/24 Javascript
深入浅析Bootstrap列表组组件
2016/05/03 Javascript
关于动态生成dom绑定事件失效的原因及解决方法
2016/08/06 Javascript
JavaScript实现焦点进入文本框内关闭输入法的核心代码
2017/09/20 Javascript
Angularjs中date过滤器失效的问题及解决方法
2018/07/06 Javascript
vscode配置vue下的es6规范自动格式化详解
2019/03/20 Javascript
详解JS实现简单的时分秒倒计时代码
2019/04/25 Javascript
jquery实现Ajax请求的几种常见方式总结
2019/05/28 jQuery
nodejs处理tcp连接的核心流程
2021/02/26 NodeJs
Python进行数据科学工作的简单入门教程
2015/04/01 Python
Python的Django框架中的Context使用
2015/07/15 Python
Django URL传递参数的方法总结
2016/08/28 Python
Python实现MySQL操作的方法小结【安装,连接,增删改查等】
2017/07/12 Python
python中列表和元组的区别
2017/12/18 Python
详解Python使用Plotly绘图工具,绘制甘特图
2019/04/02 Python
基于python实现的百度新歌榜、热歌榜下载器(附代码)
2019/08/05 Python
python 利用pywifi模块实现连接网络破解wifi密码实时监控网络
2019/09/16 Python
keras 自定义loss model.add_loss的使用详解
2020/06/22 Python
教师党员承诺书
2014/03/25 职场文书
宣传稿格式范文
2015/07/23 职场文书
初中英语教学随笔
2015/08/15 职场文书
2016年“我们的节日·端午节”活动总结
2016/04/01 职场文书
2019学校请假条格式及范文
2019/06/25 职场文书
Css预编语言及区别详解
2021/04/25 HTML / CSS
Java生成读取条形码和二维码的简单示例
2021/07/09 Java/Android
Mysql将字符串按照指定字符分割的正确方法
2022/05/30 MySQL