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的常用方法总结大全
Jul 19 Python
在Python中执行系统命令的方法示例详解
Sep 14 Python
Python实现Kmeans聚类算法
Jun 10 Python
浅谈Python2、Python3相对路径、绝对路径导入方法
Jun 22 Python
python3.5绘制随机漫步图
Aug 27 Python
python中的print()输出
Apr 12 Python
利用Python库Scapy解析pcap文件的方法
Jul 23 Python
Django中使用CORS实现跨域请求过程解析
Aug 05 Python
Python for循环与getitem的关系详解
Jan 02 Python
python属于软件吗
Jun 18 Python
python爬取代理ip的示例
Dec 18 Python
python调试工具Birdseye的使用教程
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对字符串的递增运算分析
2010/08/08 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十)
2014/06/24 PHP
Zend Framework框架Smarty扩展实现方法
2016/03/22 PHP
php实现保存周期为1天的购物车类
2017/07/07 PHP
visual studio code 调试php方法(图文详解)
2017/09/15 PHP
些很实用且必用的小脚本代码
2006/06/26 Javascript
检测是否已安装 .NET Framework 3.5的js脚本
2009/02/14 Javascript
JS 自定义函数缺省值的设置方法
2010/05/05 Javascript
jQuery动态添加 input type=file的实现代码
2012/06/14 Javascript
jquery实现不同大小浏览器使用不同的css样式表的方法
2014/04/02 Javascript
jQuery Ajax调用WCF服务详细教程
2015/03/31 Javascript
JS对象与json字符串相互转换实现方法示例
2018/06/14 Javascript
vue3.0 CLI - 2.4 - 新组件 Forms.vue 中学习表单
2018/09/14 Javascript
js实现简单模态框实例
2018/11/16 Javascript
Vue项目部署在Spring Boot出现页面空白问题的解决方案
2018/11/26 Javascript
详解Vue.js自定义tipOnce指令用法实例
2018/12/19 Javascript
js实现的格式化数字和金额功能简单示例
2019/07/30 Javascript
细说webpack6 Babel的使用详解
2019/09/26 Javascript
JavaScript实现HSL拾色器
2020/05/21 Javascript
python实现搜索本地文件信息写入文件的方法
2016/02/22 Python
Python中的pygal安装和绘制直方图代码分享
2017/12/08 Python
解决python使用open打开文件中文乱码的问题
2017/12/29 Python
python使用pycharm环境调用opencv库
2018/02/11 Python
python3调用R的示例代码
2018/02/23 Python
在Python中pandas.DataFrame重置索引名称的实例
2018/11/06 Python
Django-Rest-Framework 权限管理源码浅析(小结)
2018/11/12 Python
解决python flask中config配置管理的问题
2019/07/26 Python
Python logging自定义字段输出及打印颜色
2020/11/30 Python
一文带你了解Python 四种常见基础爬虫方法介绍
2020/12/04 Python
pycharm 如何取消连按两下shift出现的全局搜索
2021/01/15 Python
详解CSS3中的box-sizing(content-box与border-box)
2019/04/19 HTML / CSS
物理系毕业生自荐信
2013/11/01 职场文书
八年级作文之友谊
2019/12/02 职场文书
基于Redis过期事件实现订单超时取消
2021/05/08 Redis
关于React Native 无法链接模拟器的问题
2021/06/21 Javascript
Python实现科学占卜 让视频自动打码
2022/04/09 Python