1. 程式人生 > 其它 >python實現爬取小說網站文字

python實現爬取小說網站文字

簡單記錄一次python爬取某小說網站小說的操作

#!/usr/bin/python
# -*- coding:utf-8 -*-
import urllib.request
import re
# html = urllib.request.urlopen("https://xiaoshuo.net/0/745/")
# data = html.read()

#print(data)
# def getUrl(urlData):
#     print("test")
#     r = r"[a-zA-Z]+://[^\s]*.html"
#     pat = re.compile(r)
#     urls = re.findall(pat,str(urlData))
#     print(urls)
#
# getUrl(data)

from lxml.html import fromstring
from bs4 import BeautifulSoup
import urllib.request
import requests
import time

#給定網址和標題
def getContent(url,title):
    # html = urllib.request.get(url)
    # data = html.read().decode()
    # print(url)
    first = requests.get(url)
    if first.status_code!=200:
        time.sleep(3)       #網站伺服器可能不行,請求失敗就隔3s請求
        getContent(url,title)
        return
    data = first.content    #網頁內容
    soup = BeautifulSoup(data, "html.parser") #多種解析器,這裡選這個就夠用了
    # print(soup.prettify())
    content = soup.find_all("div", attrs={"id": "content"})
    # filename = title + ".txt"
    filename = "檔名稱.txt"   #檔名稱,自己改
    filea = open(filename, "a", encoding='utf-8')  #追加,把每一章合併成一個txt

    print(title,file=filea)     #輸出到檔案的內容
    print(content, file=filea)
    print("",file=filea)

    print(url + " " + title + " 下載儲存完畢") #提示該章下載完畢
    return

def getTitles(url):
    data = requests.get(url).content

    soup = BeautifulSoup(data, "html.parser")
    head = "https://xiaoshuo.net"
    middle = "/17/17225/"       #應該自動擷取,但是本來就簡單,根據需要寫死就行了。
    titles = soup.find_all("a")
    # print(titles)
    for title in titles:
        str1 = str(title)
        if str1.find(middle) != -1:
            if str1.find("https")!= -1:     #過濾一下網頁的連結
                continue
            elem = fromstring(str1)
            url = head + elem.attrib["href"]    #這些處理都是根據網頁結構弄的
            text = elem.text
            getContent(url, text)
            time.sleep(2)       #脆弱的伺服器,不能接收過多過快請求
getTitles("https://xiaoshuo.net/17/17225/")	#網址肯定是需要自己改的
#下載完畢,需要自行處理一些格式上的問題,還有編碼問題



要實現網頁訪問,方法也很多,針對這個靜態網站,感覺簡單的request.get就可以了。

還有就是我用的pycharm執行,開著fiddler好像有什麼代理錯誤,所以還是關閉系統代理伺服器下載吧。