美文网首页大数据 爬虫Python AI Sql
python多线程爬虫爬取顶点小说内容(BeautifulSou

python多线程爬虫爬取顶点小说内容(BeautifulSou

作者: 小太阳花儿 | 来源:发表于2017-12-18 10:43 被阅读77次
    思路

    之前写过python爬取起点中文网小说,多线程则是先把爬取的章节链接存到一个列表里,然后写一个函数get_text每次调用这个函数就传一个章节链接,那么就需要调用n次该函数来获取n章的内容,所以可以用for循环创建n个线程,线程的target就是get_text,参数就是章节的url。

    被爬取页面

    随便点开的,辣眼睛哈哈哈


    全部章节页
    from bs4 import *
    import socket
    import time
    
    
    #在小说章节页爬取所有章节链接
    def get_html():
        
        #从你的浏览器控制台复制出http报文的header信息
        header = {'User-Agent':'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0'}
        url = 'https://www.dingdiann.com/ddk81000/'
        
        #发送一个http请求,读出网页内容存到html
        req = urllib.request.Request(url,headers=header)
        html = urllib.request.urlopen(req).read()
    
        #网页里有中文,需要decode
        html.decode('utf-8','ignore')
        
        #用BeautifulSoup处理html 不加‘lxml’参数会警告
        soup = BeautifulSoup(html,'lxml')
        
        #chapters用来存放所有章节的链接
        chapters = []
        
        dds = soup.find_all('dd')
        for dd in dds:
            chapters.append('https://www.dingdiann.com'+dd.a.get('href'))
            #print(dd.a.get('href'))
        return chapters
    
    #获取章节文本信息
    def get_text(url):
        header = {'User-Agent':'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0'}
        req = urllib.request.Request(url,headers=header)
        
        response = urllib.request.urlopen(req)
        html = response.read().decode('utf-8','igore')
        
        #关闭请求 防止服务器拒绝服务
        response.close()
        
        soup = BeautifulSoup(html,'lxml')
        
        
        #title = soup.find(class_='bookname').h1.text
        try:
            #找到章节名
            title = soup.find(class_='bookname').h1.text
            
            #为中文字符串构造正则表达式,识别出“第X章”
            str = title.encode('utf-8')
            filename = re.search(u'.*章'.encode('utf-8'),str).group().decode('utf-8')
            #用追加方式打开文件,文件名是“第X章”
            f = open('C:/Users/liuxu/Desktop/book/'+filename+ '.txt','w+')
            #写入标题
            f.write(title+'\n\n')
            #逐行写入小说段落
            text = soup.find(id='content').text
            lines = re.findall(r'\s{2}\S*',text)
            for line in lines:
                f.write(line+'\n')
            #关闭文件
            f.close()
        except:
            #异常处理 防止因为出错而中断爬取程序
            print('error in writing')
            
              
    #socket.setdefaulttimeout(20) 
    threads = [] 
    for chapter in get_html():
        th = threading.Thread(target=get_text,args=(chapter,))
        threads.append(th)
    
    for t in threads:
        t.start()
        #每两个进程之间间隔3秒 防止报出错误“[WinError 10054] 远程主机强迫关闭了一个现有的连接”
        time.sleep(3)
    
    爬取结果
    想和大家讨论的部分

    个人感觉用了多线程之后速度并没有很大的提升,速度大致是20个txt文件/分钟,是否有单个机器上继续提升爬取速度的方法?

    下一步打算搞点能被封ip的爬取行为,然后学学分布式爬虫。加油~

    相关文章

      网友评论

        本文标题:python多线程爬虫爬取顶点小说内容(BeautifulSou

        本文链接:https://www.haomeiwen.com/subject/vvmpwxtx.html