python多线程爬斗破苍穹
生活随笔
收集整理的這篇文章主要介紹了
python多线程爬斗破苍穹
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 前言
- 一、分析網(wǎng)頁
- 二、源代碼
- 三、結(jié)果
- 總結(jié)
前言
上星期《斗破蒼穹》終于出了,等了這么久,但是呢對(duì)于我這種沒看過小說的人來說覺得看完之后不過癮,于是就有了這一片文章…
提示:以下是本篇文章正文內(nèi)容,下面案例可供參考
一、分析網(wǎng)頁
分析一級(jí)頁面發(fā)現(xiàn),右鍵查看網(wǎng)頁源代碼就可以得到想要的內(nèi)容,包括名字和url。但前面有九個(gè)是我們不需要的而且url只有后面一部分,所以我們需要跳過前面九個(gè)然后再給其他的url進(jìn)行一個(gè)拼接。
分析二級(jí)頁面,按下F12,發(fā)現(xiàn)內(nèi)容都在一個(gè)div節(jié)點(diǎn)下。
此處的# ;在html中意思是空格
既然分析到位了,那我們就開始辦正事吧。
二、源代碼
# -!- coding: utf-8 -!- import re import requests import time from fake_useragent import UserAgent #user-agent庫 from threading import Thread #多線程 from lxml import etree #xpathclass Doupo:def __init__(self):self.url = 'https://www.tycqxs.com/57_57672/' #一級(jí)頁面self.headers = {'User-Agent':UserAgent().random} #生成一個(gè)隨機(jī)的請(qǐng)求頭self.url_head = 'https://www.tycqxs.com' #二級(jí)頁面的前綴self.urls = [] #儲(chǔ)存urlself.names = [] #儲(chǔ)存名字#請(qǐng)求網(wǎng)頁def get_html(self,url):response = requests.get(url=url,headers=self.headers).content.decode('utf-8','ignore') #向url發(fā)起請(qǐng)求并得到響應(yīng)內(nèi)容return response #返回響應(yīng)#用re解析網(wǎng)頁def parse_html(self,html,regex):info = regex.findall(html) #在html中找regex并得到一個(gè)列表 列表中是結(jié)果return info #返回找到的結(jié)果#用xpath提取具體頁面的內(nèi)容def xpath_html(self,i):while self.urls: #創(chuàng)建循環(huán) 如果列表里面有內(nèi)容就會(huì)一直循環(huán) 直到?jīng)]有內(nèi)容就會(huì)結(jié)束循環(huán)url = self.urls.pop(0) #執(zhí)行一次便刪除第一個(gè)urlname = self.names.pop(0) #執(zhí)行一次便刪除一個(gè)name 這里url和name是對(duì)應(yīng)的html = etree.HTML(self.get_html(url)) #將url傳給請(qǐng)求函數(shù)得到響應(yīng)內(nèi)容 然后將內(nèi)容轉(zhuǎn)化為Element對(duì)象content = html.xpath('//*[@id="content"]/text()') #得到這個(gè)標(biāo)簽下的所有內(nèi)容for e in content: #遍歷所有內(nèi)容with open('./斗破蒼穹/'+name,'a+',encoding='utf-8') as f: #打開在本目錄下的斗破蒼穹文件夾創(chuàng)建(或在創(chuàng)建好的文本下追加)以u(píng)tf-8的模式寫入f.write(' '*7+e.strip()+'\n') #為了美觀 先去頭尾空格換行 再在前面加空格 后面換行(因?yàn)槿绻苯訉懭肽敲磧尚袃?nèi)容中間空太多行了)print("{}完成一個(gè)任務(wù)!".format(i)) #打印線程幾完成了一個(gè)任務(wù)time.sleep(0.1) #每次執(zhí)行完停0.1秒#創(chuàng)建多線程def jobs(self):jobs = [] #創(chuàng)建一個(gè)列表用來儲(chǔ)存線程for i in range(16): #創(chuàng)建16個(gè)線程a = Thread(target=self.xpath_html,args=(i,)) #執(zhí)行self.xpath_html函數(shù) 并傳給一個(gè)參數(shù)i給它jobs.append(a) #在列表中加入線程a.start() #啟動(dòng)線程[i.join() for i in jobs] #執(zhí)行完成以后回收線程#主函數(shù)def run(self):one_html = self.get_html(self.url) #向一級(jí)頁面發(fā)起請(qǐng)求,并得到響應(yīng)內(nèi)容regex = re.compile("<dd><a href='(.*?)' >(.*?)</a></dd>", re.S) #創(chuàng)建模式對(duì)象 第一空匹配url(只有后綴) 第二空匹配章節(jié)名字info = self.parse_html(one_html,regex) #將響應(yīng)內(nèi)容和模式對(duì)象傳給解析的函數(shù)parse_html 返回一個(gè)列表for i in info[9:]: #列表的前九個(gè)是一些介紹就不需要了 所以從第十個(gè)開始遍歷if i[1][0] != '第': #排除中間的一些廣告(如果開頭第一個(gè)字不是“第”那么就跳過它)continueelse: #如果是就執(zhí)行這一步url = self.url_head+i[0] #將二級(jí)頁面的前綴和它結(jié)合一起成為一個(gè)完整的urlself.urls.append(url) #將這個(gè)url添加到self.urls中name = ''.join(i[1].split(' '))+'.txt' #拼接文件名(第一章 隕落的天才)--> (第一章隕落的天才.txt)self.names.append(name) #將拼接的文件名加入self.names中#待上面的url和name都加入完成之后 用多線程來執(zhí)行、爬取內(nèi)容self.jobs()if __name__ == '__main__':spider = Doupo()spider.run() #調(diào)用方法三、結(jié)果
總結(jié)
本文用了re和xpath解析,多線程爬取數(shù)據(jù)。
如有不對(duì)的地方還望各位大佬指出,謝謝。
總結(jié)
以上是生活随笔為你收集整理的python多线程爬斗破苍穹的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android权限设置引导
- 下一篇: informix GBase锁表处理 |