亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

python爬取某趣閣小說(2.0),十分鐘爬完一千六百章

My_Oh_My / 3132人閱讀

摘要:返回每個(gè)章節(jié)的集合。爬取完成,共計(jì)用了分鐘左右。判斷使用還是使用變量來(lái)存放未變化的,若下次循環(huán)與相等,說明此次請(qǐng)求沒有成功,,因?yàn)槟承╉?yè)面本身存在錯(cuò)誤沒有數(shù)據(jù),則需要跳過。

python爬蟲高效爬取某趣閣小說


這次的代碼是根據(jù)我之前的 筆趣閣爬取 的基礎(chǔ)上修改的,因?yàn)槭褂玫氖亲约旱膇p,所以在請(qǐng)求每個(gè)章節(jié)的時(shí)候需要設(shè)置sleep(4~5)才不會(huì)被封ip,那么在計(jì)算保存的時(shí)間,每個(gè)章節(jié)會(huì)花費(fèi)6-7秒,如果爬取一部較長(zhǎng)的小說時(shí),時(shí)間會(huì)特別的長(zhǎng),所以這次我使用了代理ip。這樣就可以不需要設(shè)置睡眠時(shí)間,直接大量訪問。

一,獲取免費(fèi)ip
關(guān)于免費(fèi)ip,我選擇的是站大爺。因?yàn)槊赓M(fèi)ip的壽命很短,所以盡量要使用實(shí)時(shí)的ip,這里我專門使用getip.py來(lái)獲取免費(fèi)ip,代碼會(huì)爬取最新的三十個(gè)ip,并以字典的形式返回兩種,如{’http‘:’ip‘},{’https‘:’ip‘}

?。。。。?!這里是另寫了一個(gè)py文件,后續(xù)正式寫爬蟲的時(shí)候會(huì)調(diào)用。

import requestsfrom lxml import etreefrom time import sleepdef getip():    base_url = "https://www.zdaye.com"    url = "https://www.zdaye.com/dayProxy.html"    headers = {        "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36"    }    res = requests.get(url, headers=headers)    res.encoding = "utf-8"    dom = etree.HTML(res.text)    sub_urls = dom.xpath("http://h3[@class ="thread_title"]/a/@href")    sub_pages =[]    for sub_url in sub_urls:        for i in range(1, 11):            sub_page = (base_url + sub_url).rstrip(".html") + "/" + str(i) + ".html"            sub_pages.append(sub_page)    http_list = []    https_list = []    for sub in sub_pages[:3]:        sub_res = requests.get(sub, headers=headers)        sub_res.encoding = "utf-8"        sub_dom = etree.HTML(sub_res.text)        ips = sub_dom.xpath("http://tbody/tr/td[1]/text()")        ports = sub_dom.xpath("http://tbody/tr/td[2]/text()")        types = sub_dom.xpath("http://tbody/tr/td[4]/text()")        sleep(3)        sub_res.close()        for ip,port,type in zip(ips, ports,types):            proxies_http = {}            proxies_https= {}            http = "http://" + ip + ":" + port            https = "https://" + ip + ":" + port            #分別存儲(chǔ)http和https兩種            proxies_http["http"] = http            http_list.append(proxies_http)            proxies_https["https"] = https            https_list.append(proxies_https)    return  http_list,https_listif __name__ == "__main__":    http_list,https_list = getip()    print(http_list)    print(https_list)

二,完整代碼放在最后后面了,這里的 from getip import getip 就是前面獲取ip部分。
這里我收集數(shù)十個(gè)常用的請(qǐng)求頭,將它們與三十個(gè)IP隨機(jī)組合,共可以得到300個(gè)左右的組合。

這里我定義了三個(gè)函數(shù)用于實(shí)現(xiàn)功能。
biquge_get()函數(shù):輸入搜索頁(yè)面的url,關(guān)于搜索的實(shí)現(xiàn)是修改url中的kw,在main函數(shù)中有體現(xiàn)。
--------------------------返回書籍首頁(yè)的url和書名。

get_list()函數(shù):輸入biquge_get返回的url。
---------------------返回每個(gè)章節(jié)的url集合。

info_get()函數(shù):輸入url,ip池,請(qǐng)求頭集,書名。
---------------------將每次的信息保存到本地。

info_get()函數(shù)中我定義四個(gè)變量a,b,c,d用于判斷每個(gè)章節(jié)是否有信息返回,在代碼中有寫足夠清晰的注釋。
這里我講一下我的思路,在for循環(huán)中,我循環(huán)的是章節(jié)長(zhǎng)度的十倍。a,b,c的初始值都是0。
通過索引,url=li_list[a]可以請(qǐng)求每個(gè)章節(jié)內(nèi)容,a的自增實(shí)現(xiàn)跳到下一個(gè)url。但是在大量的請(qǐng)求中也會(huì)有無(wú)法訪問的情況,所以在返回的信息 ’ text1 ‘ 為空的情況a-=1,那么在下一次循環(huán)是依舊會(huì)訪問上次沒有結(jié)果的url。

這里我遇到了一個(gè)坑,我在測(cè)試爬取的時(shí)候會(huì)打印a的值用于觀察,出現(xiàn)它一直打印同一個(gè)章節(jié)數(shù)‘340’直到循環(huán)結(jié)束的情況,此時(shí)我以為是無(wú)法訪問了。后來(lái)我找到網(wǎng)頁(yè)對(duì)照,發(fā)現(xiàn)這個(gè)章節(jié)本來(lái)就沒有內(nèi)容,是空的,所以程序會(huì)一直卡在這里。所以我設(shè)置了另外兩個(gè)變量b,c。

1,使用變量b來(lái)存放未變化的a,若下次循環(huán)b與a相等,說明此次請(qǐng)求沒有成功,c++,因?yàn)槟承╉?yè)面本身存在錯(cuò)誤沒有數(shù)據(jù),則需要跳過。
2,若c大于10,說明超過十次的請(qǐng)求,都因?yàn)橐恍┚売墒×?,則a++,跳過這一章節(jié),同時(shí)變量d減一,避免后續(xù)跳出循環(huán)時(shí)出現(xiàn)索引錯(cuò)誤


最后是變量d,d的初始值設(shè)置為章節(jié)長(zhǎng)度,d = len(li_list),a增加到與d相同時(shí)說明此時(shí)li_list的所有url都使用完了,那么就需要跳出循環(huán)。
然后就是將取出的數(shù)據(jù)保存了。

最后測(cè)試,一共1676章,初始速度大概一秒能下載兩章內(nèi)容左右。

爬取完成,共計(jì)用了10分鐘左右。

import requestsfrom lxml import etreefrom getip import getipimport randomimport timeheaders= {        "User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36"    }"""kw輸入完成搜索,打印所有的搜索結(jié)果返回選擇的書籍的url"""def biquge_get(url):    book_info = []    r = requests.get(url =url,                     headers = headers,                     timeout = 20                     )    r.encoding = r.apparent_encoding    html = etree.HTML(r.text)    # 獲取搜索結(jié)果的書名    bookname = html.xpath("http://td[@class = "odd"]/a/text()")    bookauthor = html.xpath("http://td[@class = "odd"]/text()")    bookurl = html.xpath("http://td[@class = "odd"]/a/@href")    print("搜索結(jié)果如下:/n")    a = 1    b = 1    for i in bookname:        print(str(a) + ":", i, "/t作者:", bookauthor[int(b - 1)])        book_info.append([str(a),i,bookurl[a-1]])        a = a + 1        b = b + 2    c = input("請(qǐng)選擇你要下載的小說(輸入對(duì)應(yīng)書籍的編號(hào)):")    book_name = str(bookname[int(c) - 1])    print(book_name, "開始檢索章節(jié)")    url2 = html.xpath("http://td[@class = "odd"]/a/@href")[int(c) - 1]    r.close()    return url2,book_name"""輸入書籍的url,返回每一章節(jié)的url"""def get_list(url):    r = requests.get(url = url,                     headers = headers,                     timeout = 20)    r.encoding = r.apparent_encoding    html = etree.HTML(r.text)    # 解析章節(jié)    li_list = html.xpath("http://*[@id="list"]/dl//a/@href")[9:]    return li_list#請(qǐng)求頭集user_agent = [       "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)",       "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",       "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",       "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",       "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",       "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",       "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",       "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",       "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",       "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",       "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",       "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",       "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5",       "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6",       "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",       "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20",       "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52"]"""參數(shù):url,ip池,請(qǐng)求頭集,書名"""def info_get(li_list,ip_list,headers,book_name):    print("共計(jì)"+str(len(li_list))+"章")    """    a,用于計(jì)數(shù),成功請(qǐng)求到html并完成后續(xù)的存寫數(shù)據(jù)才會(huì)繼續(xù)請(qǐng)求下一個(gè)url    b,在循環(huán)中存放未經(jīng)過信息返回存儲(chǔ)判斷的a,用于與下一次循環(huán)的a作比較,判斷a是否有變化    c,若超過10次b=a,c會(huì)自增,則說明應(yīng)該跳過此章節(jié),同時(shí)d減一    d,章節(jié)長(zhǎng)度    """    a = 0    b = 0    c = 0    d = len(li_list)    fp = open("./"+str(book_name)+".txt", "w", encoding="utf-8")    #這里循環(huán)了10倍次數(shù)的章節(jié),防止無(wú)法爬取完所有的信息。    for i in range(10*len(li_list)):        url = li_list[a]        #判斷使用http還是https        if url[4:5] == "s":            proxies = random.choice(ip_list[0])        else:            proxies = random.choice(ip_list[1])        try:            r = requests.get(url=url,                             headers={"User-Agent": random.choice(headers)},                             proxies=proxies,                             timeout=5                            )            r.encoding = r.apparent_encoding            r_text = r.text            html = etree.HTML(r_text)            try:                title = html.xpath("/html/body/div/div/div/div/h1/text()")[0]            except:                title = html.xpath("/html/body/div/div/div/div/h1/text()")            text = html.xpath("http://*[@id="content"]/p/text()")            text1 = []            for i in text:                text1.append(i[2:])            """            使用變量b來(lái)存放未變化的a,若下次循環(huán)b與a相等,說明此次請(qǐng)求沒有成功,c++,因?yàn)槟承╉?yè)面本身存在錯(cuò)誤沒有數(shù)據(jù),則需要跳過。            若c大于10,說明超過十次的請(qǐng)求,都因?yàn)橐恍┚売墒×?,則a++,跳過這一章節(jié),同時(shí)變量d減一,避免后續(xù)跳出循環(huán)時(shí)出現(xiàn)索引錯(cuò)誤            """            if b == a:                c += 1            if c > 10:                a += 1                c = 0                d -=1            b = a            #a+1,跳到下一個(gè)url,若沒有取出信息則a-1.再次請(qǐng)求,若有數(shù)據(jù)返回則保存            a+=1            if len(text1) ==0:                a-=1            else:                fp.write("第"+str(a+1)+"章"+str(title) + ":/n" +"/t"+str(",".join(text1) + "/n/n"))                print("《"+str(title)+"》","下載成功!")            r.close()        except EnvironmentError as e:            pass        # a是作為索引在li_list中取出對(duì)應(yīng)的url,所以最后a的值等于li_list長(zhǎng)度-1,并以此為判斷標(biāo)準(zhǔn)是否跳出循環(huán)。        if a == d:            break    fp.close()if __name__ == "__main__":    kw = input("請(qǐng)輸入你要搜索的小說:")    url = f"http://www.b520.cc/modules/article/search.php?searchkey={kw}"    bookurl,book_name = biquge_get(url)    li_list = get_list(bookurl)    ip_list = getip()    t1 = time.time()    info_get(li_list,ip_list,user_agent,book_name)    t2 = time.time()    print("耗時(shí)"+str((t2-t1)/60)+"min")

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/119991.html

相關(guān)文章

  • ??在完一周的朋友圈后,我發(fā)現(xiàn)了.......驚人??秘密

    各位童鞋,大家好,我是? 在《?UI自動(dòng)化工具輕松實(shí)現(xiàn)微信消息收發(fā)?朋友圈爬取??》文末給童鞋們布置了一個(gè)作業(yè),批量朋友圈爬取,不知道大伙們是否還有映像。 看到很多小伙伴們踴躍報(bào)名參與,不禁要給你們點(diǎn)個(gè)贊??紤]到很多小伙伴想做卻做出來(lái),這…貼心的我這不就來(lái)給你們公布參考答案啦? 對(duì)相關(guān)基礎(chǔ)還不了解的童鞋請(qǐng)參考前文: 《?UI自動(dòng)化工具輕松實(shí)現(xiàn)微信消息收發(fā)?朋友圈爬取??》 《???對(duì)比PyWi...

    Cympros 評(píng)論0 收藏0
  • Python3 爬蟲 requests+BeautifulSoup4(BS4) 爬取小說網(wǎng)站數(shù)據(jù)

    摘要:剛學(xué)爬蟲不久,迫不及待的找了一個(gè)網(wǎng)站練手,新筆趣閣一個(gè)小說網(wǎng)站。繼續(xù)學(xué)習(xí),有改進(jìn)方案的歡迎提出來(lái),一起交流。 剛學(xué)Python爬蟲不久,迫不及待的找了一個(gè)網(wǎng)站練手,新筆趣閣:一個(gè)小說網(wǎng)站。 前提準(zhǔn)備 安裝Python以及必要的模塊(requests,bs4),不了解requests和bs4的同學(xué)可以去官網(wǎng)看個(gè)大概之后再回來(lái)看教程 爬蟲思路 剛開始寫爬蟲的小白都有一個(gè)疑問,進(jìn)行到什么時(shí)候...

    taoszu 評(píng)論0 收藏0
  • HTML中的圖片

    摘要:中的圖片圖片的三種格式適合照片,包含一千六百多種顏色,這是一種有損格式,因?yàn)檎掌s小時(shí)會(huì)丟掉圖像的一些信息不支持透明度文件比較小不支持動(dòng)畫支持上百種顏色,的圖像。 HTML中的圖片 < img src=> 圖片的三種格式 JPG JPG適合照片,包含一千六百多種顏色,這是一種有損格式,因?yàn)檎掌s小時(shí)會(huì)丟掉圖像的一些信息 不支持透明度 文件比較小 不支持動(dòng)畫 PNG PNG支持上百種...

    godruoyi 評(píng)論0 收藏0
  • 爬蟲數(shù)據(jù)庫(kù)一些簡(jiǎn)單的設(shè)計(jì)邏輯

    摘要:所以要設(shè)計(jì)條隊(duì)列,保存商品信息。數(shù)據(jù)更新問題有新商品進(jìn)來(lái),直接插入即可,如果是舊商品,那要不要更新數(shù)據(jù)庫(kù)里的內(nèi)容呢一般來(lái)說是可以更新的,但有種情況例外,就是你的數(shù)據(jù)庫(kù)會(huì)有人去編輯的情況。 場(chǎng)景:爬取某商城的部分商品。 隊(duì)列設(shè)計(jì) 這里至少需要爬取2種資源,一種是商品列表,一種是商品信息。所以要設(shè)計(jì)1條隊(duì)列,保存商品信息URL。 爬蟲1定期爬前N個(gè)列表頁(yè) URL,把里面的商品信息URL爬下...

    edagarli 評(píng)論0 收藏0
  • python爬蟲:取某網(wǎng)站視頻

    摘要:把獲取到的下載視頻的存放在數(shù)組中也可寫入文件中,通過調(diào)用迅雷接口,進(jìn)行自動(dòng)下載。 把獲取到的下載視頻的url存放在數(shù)組中(也可寫入文件中),通過調(diào)用迅雷接口,進(jìn)行自動(dòng)下載。(請(qǐng)先下載迅雷,并在其設(shè)置中心的下載管理中設(shè)置為一鍵下載)實(shí)現(xiàn)代碼如下: from bs4 import Bea...

    番茄西紅柿 評(píng)論0 收藏2637

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<