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实现公历(阳历)转农历(阴历)的方法示例
Aug 22 Python
Python3.6简单操作Mysql数据库
Sep 12 Python
对Python中数组的几种使用方法总结
Jun 28 Python
Python基于sklearn库的分类算法简单应用示例
Jul 09 Python
Python切片操作深入详解
Jul 27 Python
PyTorch使用cpu加载模型运算方式
Jan 13 Python
Python+OpenCV实现图像的全景拼接
Mar 05 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
Mar 30 Python
Python中使用socks5设置全局代理的方法示例
Apr 15 Python
python中format函数如何使用
Jun 22 Python
利用Python中的Xpath实现一个在线汇率转换器
Sep 09 Python
Python+OpenCV实现图片中的圆形检测
Apr 07 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命名空间(namespace)的使用基础及示例
2014/08/18 PHP
PHP中set_include_path()函数相关用法分析
2016/07/18 PHP
使用PHPMailer发送邮件实例
2017/02/15 PHP
在视频前插入广告
2006/11/20 Javascript
jquery 图片上传按比例预览插件集合
2011/05/28 Javascript
通过js动态操作table(新增,删除相关列信息)
2012/05/23 Javascript
jquery 鼠标滑动显示详情应用示例
2014/01/24 Javascript
js正则表达exec与match的区别说明
2014/01/29 Javascript
JavaScript中的标签语句用法分析
2015/02/10 Javascript
Jquery简单实现GridView行高亮的方法
2015/06/15 Javascript
D3.js中data(), enter() 和 exit()的问题详解
2015/08/17 Javascript
es6系列教程_ Map详解以及常用api介绍
2017/09/25 Javascript
微信小程序选择图片和放大预览图片功能
2017/11/02 Javascript
Vue v2.4中新增的$attrs及$listeners属性使用教程
2018/01/08 Javascript
vue单页缓存存在的问题及解决方案(小结)
2018/09/25 Javascript
ElementUI radio组件选中小改造
2019/08/12 Javascript
Openlayers显示瓦片网格信息的方法
2020/09/28 Javascript
ant design vue中表格指定格式渲染方式
2020/10/28 Javascript
Python help()函数用法详解
2014/03/11 Python
利用Python获取操作系统信息实例
2016/09/02 Python
python实现简易数码时钟
2021/02/19 Python
python实现QQ批量登录功能
2019/06/19 Python
Python使用Slider组件实现调整曲线参数功能示例
2019/09/06 Python
Python多线程多进程实例对比解析
2020/03/12 Python
python批量检查两个对应的txt文件的行数是否一致的实例代码
2020/10/31 Python
css3新增颜色表示方式分享
2014/04/15 HTML / CSS
HTML5新增属性data-*和js/jquery之间的交互及注意事项
2017/08/08 HTML / CSS
如何打印出当前源文件的文件名以及源文件的当前行号
2015/04/05 面试题
公司司机岗位职责范本
2014/03/03 职场文书
职业生涯规划书怎么写?
2014/09/14 职场文书
承诺函格式模板
2015/01/21 职场文书
放假通知格式
2015/04/14 职场文书
工程合作意向书范本
2015/05/09 职场文书
2015年暑期社会实践总结
2015/07/13 职场文书
php修改word的实例方法
2021/11/17 PHP
Python 操作pdf pdfplumber读取PDF写入Exce
2022/08/14 Python