系统:windows

语言:python

工具:pycharm

需要的包:beautifulsoup、requests

安装以上的包,方法类似,

手动方式

任务:爬300条。采用多线程、非多线程

单线程:

import requests
import bs4
import time
import re


root_url = 'http://wufazhuce.com'


def get_url(num):
    return root_url + '/one/' + str(num)



def get_data(url):
    response = requests.get(url)
    soup = bs4.BeautifulSoup(response.text, "html.parser")

    try:
        for meta in soup.select('div'):

                if meta['class'][0] == 'one-cita':
                    str = meta.string
    except:
        a = 1
    finally:
        b = 2
    soup.div['class'] = "one-cita"
    # 获取编号
    strNum = soup.head.title.contents[0][4:8]
    print(strNum)
    patt = re.compile(r'^[\d\s]{1,7}$', re.I|re.U|re.X)
    # 判断strNum是否为数字
    if patt.match(strNum):
        # 获取文字内容
        strContent = str.strip()
        print(strContent)

        f=open('f.txt','a',encoding='utf-8')
        f.write(strNum)
        f.write(':')
        f.write(strContent)
        f.write('\n')
        f.close()



if __name__ == '__main__':
    start = time.time()
    for i in range(300):
        get_data(get_url(1000+i))
    end = time.time()
    print('use: %.2f s' % (end - start))


多线程:四个线程,一般电脑四核。

from multiprocessing import Pool
import os
import requests
import bs4
import time
import re


root_url = 'http://wufazhuce.com'


def get_url(num):
    return root_url + '/one/' + str(num)



def get_data(url):

    response = requests.get(url)
    soup = bs4.BeautifulSoup(response.text, "html.parser")

    try:
        for meta in soup.select('div'):

                if meta['class'][0] == 'one-cita':
                    str = meta.string
    except:
        a = 1
    finally:
        b = 2
    soup.div['class'] = "one-cita"
    # 获取编号
    strNum = soup.head.title.contents[0][4:8]
    print(strNum)
    patt = re.compile(r'^[\d\s]{1,7}$', re.I|re.U|re.X)
    # 判断strNum是否为数字
    if patt.match(strNum):
        # 获取文字内容
        strContent = str.strip()
        print(strContent)
        # 打开文件
        f=open('aaa.txt','a',encoding='utf-8')
        f.write(strNum)
        f.write(':')
        f.write(strContent)
        f.write('\n')
        f.close()



def long_time_task(num):
    i= num * 75
    while i <= 75 * (num + 1):
        get_data(get_url(1000+i))
        i += 1


if __name__=='__main__':
    start = time.time()
    print('Parent process %s.' % os.getpid())
    p = Pool(4)
    for i in range(4):
        p.apply_async(long_time_task, args=(i,))
    print('Waiting for all subprocesses done...')
    p.close()
    p.join()
    end = time.time()
    print('use: %.2f s' % (end - start))
    print('All subprocesses done.')


执行时间比较:

单线程:

一辈子,有多少真心话,是以玩笑的方式说了出去? by 佚名
1269
很想打一个不说话的电话,只要你在电话那端,我可以枕着电话筒就好。 from 《蒙马特遗书》
1276
自以为用这颗小小的心脏包裹住了波澜壮阔,给这片山川湖海围上了栅栏,不放出那匹脱缰野马,这样就不会有人从我假意的冷淡里,拎出些滚烫的秘密。 by 陈大力
use: 331.22 s

多线程:

一辈子,有多少真心话,是以玩笑的方式说了出去? by 佚名
1269
很想打一个不说话的电话,只要你在电话那端,我可以枕着电话筒就好。 from 《蒙马特遗书》
1276
自以为用这颗小小的心脏包裹住了波澜壮阔,给这片山川湖海围上了栅栏,不放出那匹脱缰野马,这样就不会有人从我假意的冷淡里,拎出些滚烫的秘密。 by 陈大力
use: 81.81 s
All subprocesses done.


Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐