爬取歷史類小說
阿新 • • 發佈:2018-12-19
導包
import requests
import lxml #lxml是python的一個解析庫,支援HTML和XML的解析,支援XPath解析方式,而且解析效率非常高
from bs4 import BeautifulSoup
import pandas as pd
import os
headers從網頁獲得,按F12, —>NETWORK---->重新整理網頁---->隨便點一個name----->找到headers:User-Agent
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0'}
獲得原始碼,轉HTML格式,獲取想要的內容
url='http://www.biquge.com.tw/lishi/' yuanma_caidanye=requests.get(url,headers=headers) #選單頁的原始碼 yuanma_caidanye.encoding='gbk' html_yuanma_caidanye=BeautifulSoup(yuanma_caidanye.text,'lxml') # 原始碼轉html格式 lianjie=[] a=html_yuanma_caidanye.find_all('span',class_='s2') #獲取各個小說的連結 for i in a : lianjie.append(i.a['href'])
從上面得到的小說連結獲得下一層想要的東西,這次用 html.parser ,這個能爬全部,比上面 lxml 效果好
title=[] lianjie_zhangjie=[] for i in lianjie: yuanma_xiaoshuoye=requests.get(i) #獲取小說原始碼 yuanma_xiaoshuoye.encoding='gbk' html_yuanma_xiaoshuoye=BeautifulSoup(yuanma_xiaoshuoye.text,'html.parser') # 這個牛逼,能爬全部☆☆☆☆☆☆☆☆ title.append(html_yuanma_xiaoshuoye.find('h1').text.strip()) x=html_yuanma_xiaoshuoye.find_all('dd') lianjie_shu=[] for j in x: lianjie_shu.append(j) lianjie_zhangjie.append(lianjie_shu)
上面得到的半截的連結,給加上前半截
lianjie_zhangjie_quan=[]
for shu in lianjie_zhangjie:
lianjie_shu2=[]
for i in shu:
if i.find('a'):
try :
aa=i.find('a')['href']
lianjie_shu2.append('http://www.biquge.com.tw'+aa)
except:
print('i get the error')
lianjie_zhangjie_quan.append(lianjie_shu2)
從章節連結爬取章節內容,這段程式碼要執行很長時間
shu_all=[]
for shu in lianjie_zhangjie_quan[:]:
shu_quanwen=[]
for i in shu:
yuanma_zhangjie=requests.get(i,headers)
yuanma_zhangjie.encoding='gbk'
html_zhangjie=BeautifulSoup(yuanma_zhangjie.text,'html.parser')
try:
shu_quanwen.append(html_zhangjie.find('div',id='content').text)
except:
print('hello world')
shu_all.append(shu_quanwen)
爬下來的書進行儲存
for i in range(len(shu_all)):
filePath=r'C:\Users\Administrater\Desktop\pachong\book\\'+title[i]+".txt"
if not os.path.exists(filePath):
print('hi')
f = open(filePath, 'w', encoding="utf8")
for j in shu_all[i]:
f.write(j)
f.close()
大功告成