python多线程抓取天涯帖子内容示例
admin
2023-07-31 02:07:02
0

使用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(\'时间:(.*?).*?楼主

–>.*?
\\s*(.*?)
\’, 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\'(\\d*)\\s*下页\’)
    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(\'
\’, \’\\r\\n\’).replace(\'
\’, \’\\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(\'

时间:(.*?).*?楼主
–>.*?
\\s*(.*?)
\’, 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\'(\\d*)\\s*下页\’)
    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(\'
\’, \’\\r\\n\’).replace(\'
\’, \’\\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()

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...