在进行爬虫工作的时候,考虑到爬虫运行的速度慢,那么怎样提升爬虫的速度呢,那么就得使用多线程爬虫了,接下来我以糗事百科段子的爬取进行对多线程爬虫的概述:
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的步骤,但是顺序不定这样就达到了两个进程同时进行的目的
因此参考上面可以得到那个糗事百科的多线程爬虫代码