python爬虫——多线程爬虫

在进行爬虫工作的时候,考虑到爬虫运行的速度慢,那么怎样提升爬虫的速度呢,那么就得使用多线程爬虫了,接下来我以糗事百科段子的爬取进行对多线程爬虫的概述:
github链接
链接
一:不使用多线程爬取糗事百科
1.上代码:

import urllib.request
import re
headers={
'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}
for i in range(1, 30):
    url = 'https://www.qiushibaike.com/text/page/{}/'.format(i)
    r = urllib.request.Request(url=url, headers=headers)
    rr = urllib.request.urlopen(r).read().decode('utf-8')
    result = re.compile('<div class="content">.*?</span>', re.S).findall(str(rr))
    for j in range(0, len(result)):
        results = str(result[j]).replace(r'<div class="content">', '').replace('</span>', '').replace(
            '<br/><br/>', '').replace(r'\n', '').replace('<span>', '')
        print("第" + str(i) + "页" + "第" + str(j) + "个段子" + results)

2.首先分析网页
在这里插入图片描述
在这里插入图片描述
可以分析的出每页的变化在url中变化的是page/+页码/
这样可以构造url进行分页爬取
代码如下

for i in range(1, 30):
    url = 'https://www.qiushibaike.com/text/page/{}/'.format(i)

3.然后进行对网页源代码的得到

  r = urllib.request.Request(url=url, headers=headers)
  rr = urllib.request.urlopen(r).read().decode('utf-8')

4.使用正则进行对需要的内容的提取
在这里插入图片描述
可以分析得到正则表达式

result = re.compile('<div class="content">.*?</span>', re.S).findall(str(rr))

5.进行进一步处理
去掉不需要的内容和进行输出

  for j in range(0, len(result)):
        results = str(result[j]).replace(r'<div class="content">', '').replace('</span>', '').replace(
            '<br/><br/>', '').replace(r'\n', '').replace('<span>', '')
        print("第" + str(i) + "页" + "第" + str(j) + "个段子" + results)

二:改写为多线程爬虫
1.上代码:

import urllib.request
import threading
import re
headers={
'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}
class one(threading .Thread ):
    def __init__(self):
        threading.Thread.__init__(self)
    def run(self):
        for i in range(1,30,2):
            url = 'https://www.qiushibaike.com/text/page/{}/'.format(i)
            r = urllib.request.Request(url=url, headers=headers)
            rr = urllib.request.urlopen(r).read().decode('utf-8')
            result = re.compile('<div class="content">.*?</span>', re.S).findall(str(rr))
            for j in range(0, len(result)):
                results = str(result[j]).replace(r'<div class="content">', '').replace('</span>', '').replace(
                    '<br/><br/>', '').replace(r'\n', '').replace('<span>', '')
                print("第" + str(i) + "页" + "第" + str(j) + "个段子" + results)
class two(threading.Thread ):
    def __init__(self):
        threading .Thread.__init__(self)
    def run(self):
        for i in range(2, 30, 2):
            url = 'https://www.qiushibaike.com/text/page/{}/'.format(i)
            r = urllib.request.Request(url=url, headers=headers)
            rr = urllib.request.urlopen(r).read().decode('utf-8')
            result = re.compile('<div class="content">.*?</span>', re.S).findall(str(rr))
            for j in range(0, len(result)):
                results = str(result[j]).replace(r'<div class="content">', '').replace('</span>', '').replace(
                    '<br/><br/>', '').replace(r'\n', '').replace('<span>', '')
                print("第" + str(i) + "页" + "第" + str(j) + "个段子" + results)
t1=one()
t1.start()
t2=two()
t2.start()

2.代码讲解
使用了两个线程one和two分别对奇数页和偶数页进行爬取
首先我们需要了解多线程爬虫,以下是一个最简单的多线程:

class one(threading .Thread ):
    def __init__(self):
        threading.Thread.__init__(self)
    def run(self):
        for i in range(1,10):
           print("A)
class two(threading.Thread ):
    def __init__(self):
        threading .Thread.__init__(self)
    def run(self):
       print("B)
t1=one()
t1.start()
t2=two()
t2.start()

运行以后会同时进行打印A和打印B的步骤,但是顺序不定这样就达到了两个进程同时进行的目的
因此参考上面可以得到那个糗事百科的多线程爬虫代码

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值