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 调用VC++的动态链接库(DLL)
Sep 06 Python
讲解python参数和作用域的使用
Nov 01 Python
python中cPickle用法例子分享
Jan 03 Python
Python实现批量转换文件编码的方法
Jul 28 Python
python3编写ThinkPHP命令执行Getshell的方法
Feb 26 Python
python基础知识(一)变量与简单数据类型详解
Apr 17 Python
利用Django模版生成树状结构实例代码
May 19 Python
Python3显示当前时间、计算时间差及时间加减法示例代码
Sep 07 Python
python3用PyPDF2解析pdf文件,用正则匹配数据方式
May 12 Python
python3的pip路径在哪
Jun 23 Python
Python读写锁实现实现代码解析
Nov 28 Python
Python使用mitmproxy工具监控手机 下载手机小视频
Apr 18 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使用curl和正则表达式抓取网页数据示例
2014/04/13 PHP
PHP表单提交后引号前自动加反斜杠的原因及三种办法关闭php魔术引号
2015/09/30 PHP
PHP常见漏洞攻击分析
2016/02/21 PHP
浅谈PHP命令执行php文件需要注意的问题
2016/12/16 PHP
去掉gridPanel表头全选框的小例子
2013/07/18 Javascript
js中点击空白区域时文本框与隐藏层的显示与影藏问题
2013/08/26 Javascript
javascript实现下班倒计时效果的方法(可桌面通知)
2015/07/10 Javascript
Boostrap模态窗口的学习小结
2016/03/28 Javascript
js正则表达式replace替换变量方法
2016/05/21 Javascript
最全的Javascript编码规范(推荐)
2016/06/22 Javascript
Angular在一个页面中使用两个ng-app的方法(二)
2017/02/20 Javascript
详解nodejs微信公众号开发——5.素材管理接口
2017/04/11 NodeJs
Ionic3 UI组件之autocomplete详解
2017/06/08 Javascript
JavaScript实现的九种排序算法
2019/03/04 Javascript
vuex根据不同的用户权限展示不同的路由列表功能
2019/09/20 Javascript
[40:03]Liquid vs Optic 2018国际邀请赛淘汰赛BO3 第一场 8.21
2018/08/22 DOTA
[57:09]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第一场 1月26日
2021/03/11 DOTA
[01:16:13]DOTA2-DPC中国联赛 正赛 SAG vs Dragon BO3 第一场 2月22日
2021/03/11 DOTA
python实现自动更换ip的方法
2015/05/05 Python
python计算方程式根的方法
2015/05/07 Python
Python2.x版本中maketrans()方法的使用介绍
2015/05/19 Python
Python unittest模块用法实例分析
2018/05/25 Python
python 弹窗提示警告框MessageBox的实例
2019/06/18 Python
python区分不同数据类型的方法
2019/10/14 Python
python解析命令行参数的三种方法详解
2019/11/29 Python
Django路由层URLconf作用及原理解析
2020/09/24 Python
一套软件开发工程师笔试题
2015/05/18 面试题
如何将无状态会话Bean发布为WEB服务,只有无状态会话Bean可以发布为WEB服务?
2015/12/03 面试题
生物医学工程专业学生求职信范文分享
2013/12/14 职场文书
后进生转化工作制度
2014/01/17 职场文书
欢度春节标语
2014/07/01 职场文书
学生不讲诚信检讨书
2014/09/29 职场文书
机器人瓦力观后感
2015/06/12 职场文书
行政后勤人员工作计划应该怎么写?
2019/08/16 职场文书
JavaScript声明变量和数据类型的转换
2022/04/12 Javascript
Django框架之路由用法
2022/06/10 Python