python爬取小说代码bs4和_使用python爬虫,requests(夹带BeautifulSoup的使用)爬取网络小说...
由于本人也是初學者,算是小白一枚,這里跟大家分享一下爬取網站上的小說的過程。
第一步我們需要導入我們需要的模塊,比如requests,BeautifulSoup,還有正則模塊re。
代碼如下:import re
import requests
from bs4 import BeautifulSoup
然后我們需要找到我們需要爬取的網站,這里我隨便選取了一個小說網站:
http://www.tianxiabachang.cn
接下來就是我們需要爬出小說的html,隨便在這個網站找到了一本小說,就比如說《某某悍刀行》吧。url = 'http://www.tianxiabachang.cn/7_7568/'
response = requests.get(url)
response.encoding = 'utf-8'
html = response.text
這樣,這就是我們獲取到了這個小說網頁的源碼html。
但是很多時候網站都會有一定的反爬蟲機制,訪問幾次之后我們所在的IP就會被封鎖,所以我們就需要做一個簡單的反反爬蟲操作,那就是給你的get請求加上header,這個header可以在目標網頁上找到。
某網站某地址的源
比如這個就是之前我們網頁的源碼,(可以摁鍵盤上的F12或者右擊鼠標點擊檢查,找到之后可以刷新一次)我們需要的是Request Headers下面的User-Agent,我們復制過來,然后就成了下面的情況。
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
直到目前為止我們爬取了《某某悍刀行》的目錄所在頁的html了。
下一步就是找到我們爬取到的html,來進行正則處理,找到我們需要的從第一章到最后一章的所有內容soup = BeautifulSoup(html,'html.parser')
one = soup.find("div",attrs={"id":"list"})
這樣我們就得到了部分我們需要的內容:
根據這個圖片,我們可以從當中寫出正則表達式:pattern1 = re.compile('
',re.S)pattern2 = re.compile('html">(.*?)
',re.S)get_url = re.findall(pattern1, str(one))
get_title = re.findall(pattern2, str(soup))
其中的pattern1 就是對文中的目錄下面的網址進行的正則表達式,選取到的是7_7568(這個代表在這個網頁下面的《雪中悍刀行》這本書的代碼)下面的3226什么開頭的數字。
而pattern2 就是網址后面的章節標題的正則表達式。
下圖就是我們正則到的內容:
很明顯的可以看到,前面的這些章節都是番外內容,跟我們一般看小說看的前后順序明顯不同,所以我們可以把這些不需要的刪掉,直接從第一章 “小二上酒”我們爬取:for i in range(41):
del get_url[0]
del get_title[0]
接下來我們創建一個當前文件夾下的一個txt文件來保存我們爬取的東西:
with open('雪中悍刀行.txt', 'a', newline='', encoding='UTF-8-sig') as txtfile:
for i in range(len(get_url)):
reallurl = url + str(get_url[i])
# print(reallurl)
response1 = requests.get(reallurl, headers=re_header)
response1.encoding = 'utf-8'
html1 = response1.text
其中的**‘a’**是代表我們不覆蓋錄入,不加newline=’'的話,有可能會每個一行留一行的空白,encoding是對數據進行編碼。
然后我們做了一個for循環,通過這個循環我們能重復操作,反復訪問,每一章的網址下面的html,所以html1就成了每一章的html。
這個就是我們得到的一章的內容,我們對這個進行BeautifulSoup處理,因為我們只需要下面的這個東西,所以,我們這么操作:soup1 = BeautifulSoup(html1, "html.parser")
one = soup1.find("div",attrs={"id":"content"})
得到的one就是我們需要的每一章小說:
然后把我們得到的數據,保存到txt文件中就行:txtfile.write(str(get_title[i]) + "\n")
txtfile.write(str(one) + "\n")
以下就是全部代碼,歡迎大家斧正!(我也保留了寫代碼時候的各種操作,大家是不是有相同的情況呢2333)
(第一次寫,有什么不好的,大家留點情555)
from urllib.request import urlretrieve
import requests
import os
import re
from bs4 import BeautifulSoup
# url = 'http://www.xbiquge.la/13/13959/'
re_header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
# url = 'http://www.tianxiabachang.cn/7_7568/3226399.html'
url = 'http://www.tianxiabachang.cn/7_7568/'
response = requests.get(url,headers = re_header)
response.encoding = 'utf-8'
html = response.text
soup = BeautifulSoup(html,'html.parser')
one = soup.find("div",attrs={"id":"list"})
# print(one)
pattern1 = re.compile('
',re.S)pattern2 = re.compile('html">(.*?)
',re.S)get_url = re.findall(pattern1, str(one))
get_title = re.findall(pattern2, str(soup))
# print(get_url)
# print(get_title)
#
for i in range(41):
del get_url[0]
del get_title[0]
# print(len(get_url), len(get_title))
#
with open('雪中悍刀行.txt', 'a', newline='', encoding='UTF-8-sig') as txtfile:
for i in range(len(get_url)):
reallurl = url + str(get_url[i])
# print(reallurl)
response1 = requests.get(reallurl, headers=re_header)
response1.encoding = 'utf-8'
html1 = response1.text
# print(html1)
soup1 = BeautifulSoup(html1, "html.parser")
one = soup1.find("div",attrs={"id":"content"})
# print(one)
# pattern3 = re.compile('
(.*?)
')
# endtxt = re.findall(pattern3, html1)
# print(html1)
# print(endtxt)
txtfile.write(str(get_title[i]) + "\n")
txtfile.write(str(one) + "\n")
print('下載第',i+1 ,'章完成')
這就是python文件正在運行中,爬取一章一章的內容。
祝大家學業有成升職加薪,謝謝,謝謝
總結
以上是生活随笔為你收集整理的python爬取小说代码bs4和_使用python爬虫,requests(夹带BeautifulSoup的使用)爬取网络小说...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用姓名字段统计人数_2019年度全国各地
- 下一篇: 判断非负整数是否是3的倍数_二、因数与倍