簡單記錄一次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好像有什么代理錯誤,所以還是關閉系統代理服務器下載吧。