感覺這個夠蛋疼的,因為你如果正常寫的話,前幾次執行沒問題,之後你連**都沒改,再執行就出錯了。。。
其實這可能是網路請求失敗,或者有反爬蟲的東西吧。但這就會讓你寫的時候非常苦惱,所以這這東西,健壯性及其重要!
import requests
from bs4 import beautifulsoup
import os
import re
import random
# 獲取url的html內容
defgethtmltext
(url):
try:
# 偽裝為瀏覽器
kv =
r = requests.get(url, timeout=10, headers=kv)
r.raise_for_status() # 如果狀態不是200,引發httperror異常
return r.text
except:
return
"產生異常"
# 把字串filestr存到本地
deftxtdownload
(filestr, txtname):
root = "e://fiction//"
path = root + txtname + ".txt"
try:
# 如果沒有,建資料夾
ifnot os.path.exists(root):
os.mkdir(root)
# 無重名檔案
ifnot os.path.exists(path):
fh = open(path, 'w')
fh.write(filestr)
fh.close()
print("文字儲存成功")
else:
print("文字已存在")
except:
print("爬取失敗")
#分析每一章url中的內容,
defhtmlanalyse
(urllist, hp):
html = gethtmltext(hp + '/' + urllist.split('$')[0])
soup = beautifulsoup(html, "html.parser")
tmp = soup.find_all(id='content')
if tmp:
text = tmp[0]
else:
print("沒有爬取到真實內容")
return
filestr = ""
for string in text.strings:
tt = repr(string)
m = re.search(r'[\u4e00-\u9fa5]', tt)
if m:
#正規表示式處理內容
strinfo = re.compile('xa0|n|r')
st2 = strinfo.sub('', m.string)
strinfo2 = re.compile(r"\\|'")
st3 = strinfo2.sub('', st2)
filestr = filestr + st3 + '\n'
txtdownload(filestr, urllist.split('$')[1])
#主頁url,分析出每一章的url和內容,返回到list列表中 用$分隔url和name
defhomeanalyseurl
(hurl):
homehtml = gethtmltext(hurl)
hsoup = beautifulsoup(homehtml, "html.parser")
tmp = hsoup.find_all(id='list')
list =
if tmp:
text = tmp[0]
else:
print("**拒絕了我們訪問")
print(hsoup.prettify())
return list
alist = text.find_all('a')
for i in range(len(alist)):
s = str(alist[i].attrs['href'])
s = s.split('/')[-1]
print("主頁全部url分析完成")
return list
#優化版本,增加隨機爬取。增加引數,
defhomeanalyseurl2
(hurl, num):
homehtml = gethtmltext(hurl)
hsoup = beautifulsoup(homehtml, "html.parser")
tmp = hsoup.find_all(id='list')
list =
if tmp:
text = tmp[0]
else:
print("**拒絕了我們訪問:")
print(hsoup.prettify())
return list
alist = text.find_all('a')
allcha = range(len(alist))
rid = random.sample(allcha,num)
for i in range(num):
s = str(alist[rid[i]].attrs['href'])
s = s.split('/')[-1]
print("主頁全部url分析完成")
return list
if __name__ == "__main__":
#所以章節的url$name列表
# homepage = ""
# homepage = ""
# homepage = ""
#good
# homepage = ""
homepage = ""
#連續爬取
# urllist = homeanalyseurl(homepage)
#隨機爬取
spinum = 10
urllist = homeanalyseurl2(homepage, spinum)
if urllist:
for i in range(spinum):
print("第 " + str(i + 1) + " 次", end='')
htmlanalyse(urllist[i], homepage)
else:
print("我們被反爬蟲了")
python 爬取小說
前些天突然想看一些 可能是因為壓力大,所以就要有補償機制吧。為了節省流量,就想著把內容爬下來,然後就可以在路上看了。於是有了下面的指令碼。usr bin env python coding utf 8 import requests from lxml import etree 為了解決unicod...
python爬取小說
一 準備 安裝 requests pyquery庫 二 使用 定義了search類 初始化時傳入 第一章url 和 名即可 再呼叫all content方法即可 coding utf8 import re import requests from requests.exceptions import...
Python爬取小說
這裡主要爬取筆趣閣的鏈結 因為筆趣閣對段時間的爬取次數做了限制,所以每次我們只能爬取十章 coding utf 8 import re import soup as soup from bs4 import beautifulsoup import requests import chardet i...