Python多线程爬虫初探—爬取豆瓣图书 top250
最近正在自学python爬虫方面的相关知识,学习到了如何使用python的urllib库进行网络爬虫,然后最近看到了多线程爬虫,于是自己也写了个小爬虫试了试多线程爬虫,把豆瓣图书top250爬了下来(这大概是新手入门最常爬的吧2333)
首先多线程简单理解就是在一个进程中同时执行多个任务,这样可以达到加快程序的运行速度的功能。
下面是代码部分:
首先是导入我们需要使用的几个模块
import re
import urllib.request
import queue
import threading
import time
然后用模块queue的Queue方法定义一个队列(一种数据结构,遵循先进先出的原则)
htmls=queue.Queue()
之后定义线程1—爬取网页的html源码并转化为以‘utf-8’编码格式的字符串
class crawhtml(threading.Thread):
def __init__(self,htmls): #重新定义Thread类的属性
threading.Thread.__init__(self)
self.htmls=htmls
def run(self): #这里是线程的执行内容
for i in range(10):
url='https://book.douban.com/top250?start='+str(i*25) #这是网址的url
html=urllib.request.urlopen(url).read().decode('utf-8') #爬取网页内容并转码为utf-8(防止中文变成乱码)
self.htmls.put(html) #把获取到的内容加入到队列中
self.htmls.task_done() #表示加入内容的完成
之后是线程2—使用正则表达式匹配出网页中我们需要的内容(图书的名字)并把它提取出来,写入文件中。
class selectword(threading.Thread):
def __init__(self,htmls):
threading.Thread.__init__(self)
self.htmls=htmls
def run(self):
rank=1 #图书的排名
for i in range(10):
htmltxt=self.htmls.get() #总共要提取十个网页的内容
htmltxt=htmltxt.replace('\n','').replace('\t','').replace(' ','')
print(htmltxt)
keyword='"title="(.+?)">' #通过观察网页源码写出正则表达式
word=re.compile(keyword).findall(htmltxt) #进行匹配
fh=open(r'C:\Users\89520\Desktop\craw.txt','a') #加r是为了防止字符串中斜杠被当作转义符
for i in range(25): #将提取出来的内容写入到craw.txt文件中
fh.write(str(rank)+'.'+word[i]+'\n')
rank=rank+1
最后是主函数
if __name__=='__main__':
craw=crawhtml(htmls)
craw.start()
select=selectword(htmls)
select.start()
这样就完成了一个简单的多线程爬虫。
第一篇博客怎么会写,就这样吧,之后计划每周至少更一篇。