python實現爬取小說網站文字
阿新 • • 發佈:2022-03-18
簡單記錄一次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好像有什麼代理錯誤,所以還是關閉系統代理伺服器下載吧。