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 http长连接客户端
Jun 12 Python
Numpy 将二维图像矩阵转换为一维向量的方法
Jun 05 Python
Python数据分析matplotlib设置多个子图的间距方法
Aug 03 Python
Python 使用PIL中的resize进行缩放的实例讲解
Aug 03 Python
Python通用循环的构造方法实例分析
Dec 19 Python
三步实现Django Paginator分页的方法
Jun 11 Python
python读取并写入mat文件的方法
Jul 12 Python
python利用7z批量解压rar的实现
Aug 07 Python
Django中自定义admin Xadmin的实现代码
Aug 09 Python
Pycharm-community-2020.2.3 社区版安装教程图文详解
Dec 08 Python
通过python-pptx模块操作ppt文件的方法
Dec 26 Python
用Python将GIF动图分解成多张静态图片
Jun 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
PHP4 与 MySQL 数据库操作函数详解
2006/12/06 PHP
PHP中=赋值操作符对不同数据类型的不同行为
2011/01/02 PHP
PHP session会话的安全性分析
2011/09/08 PHP
国外PHP程序员的13个好习惯小结
2012/02/20 PHP
php ZipArchive压缩函数详解实例
2013/11/06 PHP
JavaScript使用技巧精萃[代码非常实用]
2008/11/21 Javascript
jQuery的attr与prop使用介绍
2013/10/10 Javascript
使用jQuery获得内容以及内容的属性
2015/02/26 Javascript
Javascript中的apply()方法浅析
2015/03/15 Javascript
javascript转换静态图片,增加粒子动画效果
2015/05/28 Javascript
JavaScript合并两个数组并去除重复项的方法
2015/06/13 Javascript
jquery实现的3D旋转木马特效代码分享
2015/08/25 Javascript
使用jquery.qrcode.min.js实现中文转化二维码
2016/03/11 Javascript
Bootstrap如何创建表单
2016/10/21 Javascript
详解js中常规日期格式处理、月历渲染和倒计时函数
2016/12/28 Javascript
json的结构与遍历方法实例分析
2017/04/25 Javascript
React服务端渲染(总结)
2017/07/01 Javascript
微信小程序 五星评分的实现实例
2017/08/04 Javascript
Vue中computed与methods的区别详解
2018/03/24 Javascript
vue 录制视频并压缩视频文件的方法
2018/07/27 Javascript
vue+axios 前端实现的常用拦截的代码示例
2018/08/23 Javascript
用POSTMAN发送JSON格式的POST请求示例
2018/09/04 Javascript
详解React项目如何修改打包地址(编译输出文件地址)
2019/03/21 Javascript
JS使用for in有序获取对象数据
2020/05/19 Javascript
python 解析html之BeautifulSoup
2009/07/07 Python
python根据经纬度计算距离示例
2014/02/16 Python
Python标准库笔记struct模块的使用
2018/02/22 Python
python 列表输出重复值以及对应的角标方法
2019/06/11 Python
解决Python安装时报缺少DLL问题【两种解决方法】
2019/07/15 Python
python字典排序的方法
2019/10/12 Python
python适合做数据挖掘吗
2020/06/16 Python
python的数学算法函数及公式用法
2020/11/18 Python
使用CSS3的font-face字体嵌入样式的方法讲解
2016/05/13 HTML / CSS
函授毕业生自我鉴定范文
2014/03/25 职场文书
百善孝为先:关于孝道的经典语录
2019/10/18 职场文书
MySQL数据库之存储过程 procedure
2022/06/16 MySQL