Python爬虫实战--爬取网络小说并存放至txt文件

目录

前言

小说爬虫基本流程 

一.网站类型(1)

二.网站类型(2) 

 


前言

本教程再次更新,希望做成一个完整系列。

读者阅读完毕便可以基本掌握爬取网络小说的步骤与方法。

实践出真知,真正的学会是使用教程中的方法去爬取一个全新的网站。

【在学习的过程中千万不要先完整的学习第三方扩展包教程,例如我先把beautifulsoup教程里的所有函数操作都熟练背诵下来。这样只会浪费你的时间,因为你一段时间不使用便会忘掉。我的建议是你可以大概浏览一下每个库里的常用函数,知道每个库都可以用来做什么,然后真正实战时再进行查阅即可~】

最后,希望大家可以学会爬虫,热爱爬虫。

如果您感到有所收获,希望给我点赞,或者评论区留言,谢谢!

 

小说爬虫基本流程

                                                                

 

爬取网页:urllib,requests等

解析网页:beautifulsoup4,lxml等

 

之前我在写爬虫时在爬取独立网页时都是urllib和requests混合着使用,不过如今真的强烈推荐requests!

如果你想搞清楚urllib、urllib3、requests谁更加优秀,可以移步该讨论区stackoverflow-讨论区

 

一.网站类型(1)

从乐文小说网站上爬取小说相见欢,并存放至txt文件中

URL: 相见欢

(一)介绍

该类网站为静态网站。

特点:(1)章节目录直接加载所有章节内容【如下图所示】

(2)章节链接暴露在html中(非动态js加载)

(3)章节内容静态加载(如下图所示)

 

 

(二)爬取教程

 

首先,我们引入我们需要的库文件

 

import re
import requests
from bs4 import BeautifulSoup
from tqdm import trange
import time

 

接下来,我们进行爬虫伪装(伪装报头)

(该网站没有反爬虫机制,可以选择跳过)

 

#头部伪装
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'
}

 

我们从爬取单章开始,首先我们进入第一张的网址相见欢-第一章

url = "http://www.lewendu8.com/books/21/21335/6381842.html"
req = requests.get(url,headers=headers)
req.encoding = 'utf8'
html = req.text
data = BeautifulSoup(html,"html.parser")

 

req.encoding = 'utf8'

  将我们需要将内容进行编码,否则中文将会以乱码形式出现

我们首先获取这章的名称

section_name = data.title.string
print(section_name)

 

    运行结果:

   

 

section_name = data.title.string

 

我们利用这句话获取文章的章名(我认为比较简便的一种方法)

 

接下来我们需要获取这章的内容!!(不然看什么小说呢?)

我们按F12进入开发者功能,找出存放内容的标签

 

 

按照父子顺序细细划分

 

于是,我们寻找到了存放内容的标签

用下述语句将内容存放至section_text中

section_text = data.select('#bgdiv .border_l_r #content p')[0].text

 

按照指定格式替换章节内容,运用正则表达式

section_text=re.sub( '\s+', '\r\n\t', section_text).strip('\r\n')

运行结果

 

至此,我们单章爬取任务完成

接下来我们任务当然是获取整本小说的内容了!

 

首先我们来比较一下每一章的网址

 

 

第一章:http://www.lewendu8.com/books/21/21335/6381842.html

第二章:http://www.lewendu8.com/books/21/21335/6381843.html

……

 

因此URL的构成:http://www.lewendu8.com/books/21/21335/章节序号.html

我们观察网页源代码可以发现:

其中next_page = "6381843.html"便是下一章的章节序号

因此我们在每个网页访问结束时,便可以进行访问下一章的网址

这里我们使用正则匹配获取下一章的章节序号

 

pt_nexturl = 'var next_page = "(.*?)"'

nexturl_num = re.compile(pt_nexturl).findall(str(data))

nexturl_num = nexturl_num[0]

 

当我们访问到相见欢最后一章时

 

当访问到最后一章时,我们的小说已经全部爬取结束

此时正则匹配到的信息为:"http://www.lewendu8.com/books/21/21335/"

于是我们可以通过这个判断我们是否爬取结束

 

        if(nexturl == 'http://www.lewendu8.com/books/21/21335/'):  
            break  

 

 

当我们爬取到了内容当然要进行文件读写进行存放

 

fp = open('相见欢.txt','a')

section_text = section_text

fp.write(section_name+"\n")

fp.write(section_text+"\n")

 

 

至此,本次爬取结束~您就可以将txt文件存放到手机上,看小说喽~

 

完整代码                                                                         

'''
author: Ericam_
createtime: 2020/07/18
'''

import re
import requests
from bs4 import BeautifulSoup
from tqdm import trange


#头部伪装
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'
}

def get_download(url,novel):

    req = requests.get(url,headers=headers)
    req.encoding = 'utf8'
    html = req.text
    data = BeautifulSoup(html,"html.parser")
    #获取每一章的章节名
    section_name = data.title.string
    #获取每一章节的文章内容
    section_text = data.select('#bgdiv .border_l_r #content p')[0].text        
    #规范内容格式
    #re.sub( '\s+', '\r\n\t', section_text)指的是将内容中含有多个空格的地方替换为 回车(空行)+ tab缩进
    #.strip('\r\n')指的是将内容开头和结尾的空行
    section_text=re.sub( '\s+', '\r\n\t', section_text).strip('\r\n') 
    with open(novel,'a') as f:
        f.write(section_name+"\n")
        f.write(section_text+"\n")
    
    #通过正则表达式获取下一章节url序号
    pt_nexturl = 'var next_page = "(.*?)"'
    pt = re.compile(pt_nexturl)
    nexturl_num = re.findall(pt,str(data))[0]
    return nexturl_num





if __name__ == '__main__':

    url = "http://www.lewengu.com/books/21/21335/6381842.html"
    novel = '相见欢.txt'
    num = 228 #共228章
    for i in trange(num):
        nexturl = get_download(url,novel)
        url = "http://www.lewendu8.com/books/21/21335/"+nexturl
        if(nexturl == 'http://www.lewendu8.com/books/21/21335/'):
            break
    

    

 

经过以上部分,相信读者已经对于简单爬虫有了基本的认识,在接下来的介绍中便会加快进度。

在以上代码中我们的解析库使用的beautifulsoup4,同样优秀的解析库还有lxml,我将在下面的代码中进行演示,读者日后可以自行选择自己感兴趣的解析库进行完成爬虫代码。

 

完整源码(使用了lxml替代beautifulsoup4)

'''
author: Ericam_
createtime: 2020/07/18
'''

import re
import requests
from lxml import etree
from tqdm import trange


#头部伪装
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'
}

def get_download(url,novel):

    req = requests.get(url,headers=headers)
    req.encoding = 'utf8'
    html = req.text
    data = etree.HTML(html)
    #获取每一章的章节名
    section_name = data.xpath("//title/text()")[0]
    #获取每一章节的文章内容
    section_textl = data.xpath('//*[@id="content"]/p/text()')
    section_text = ""
    for val in section_textl:
        section_text += val
    print(section_text)       
    # 规范内容格式
    # re.sub( '\s+', '\r\n\t', section_text)指的是将内容中含有多个空格的地方替换为 回车(空行)+ tab缩进
    # .strip('\r\n')指的是将内容开头和结尾的空行
    section_text=re.sub( '\s+', '\r\n\t', section_text).strip('\r\n') 
    with open(novel,'a') as f:
        f.write(section_name+"\n")
        f.write(section_text+"\n")
    
    #通过正则表达式获取下一章节url序号
    pt_nexturl = 'var next_page = "(.*?)"'
    pt = re.compile(pt_nexturl)
    nexturl_num = re.findall(pt,str(data))[0]
    return nexturl_num





if __name__ == '__main__':

    url = "http://www.lewengu.com/books/21/21335/6381842.html"
    novel = '相见欢.txt'
    num = 228 #共228章

    for i in trange(num):
        nexturl = get_download(url,novel)
        url = "http://www.lewendu8.com/books/21/21335/"+nexturl
        if(nexturl == 'http://www.lewendu8.com/books/21/21335/'):
            break
    

    

其中,

section_name = data.xpath("//title/text()")[0]

这便是lxml利用xpath的爬取规则,读者可以自行阅读lxml文档进行学习。

在这里教大家一种简单的方法,

 

二.网站类型(2)

URL:我们纯真的青春

特点:(1)章节目录页未加载全部章节

(2)(翻页时)章节目录通过ajax加载。

简而言之就是,你翻页后,对应的url依然是

(3)其他特点如同网站类型1

 

爬取教程

【主要讲解如何获取所有章节对应的url】

1.首先打开浏览器的开发者工具(F12),点击如下按钮

2.然后保持这个页面格局不要关闭,点击“下一页”按钮

3.此时你会发现捕捉到了一条信息,点击加载详细内容

4.你会发现,该网站是通过该方式加载章节目录信息的【我们的方向没有错】

5.获取ajax请求的网址,抓取章节信息

6.我们发现访问第三页,便是在原来的网址后添加了 /3

打开该url,如图所示

 

其中chapterid便是我们需要抓取的内容。

补充说明:你可以随便点击一个章节链接,会发现其原始url后会添加一个数字。【便是该id】

7.因为该页面的信息为纯文本,因此选择使用正则表达式进行抓取。

8.剩余的操作如同(网站类型1的教程)

 

完整源码

from urllib.request import urlopen
from requests.exceptions import RequestException
import re
from requests import get
from lxml import etree
urlfirst ="http://m.ziyouge.com/novel/1402/"
k=""
index = 1
for i in range(1,67):
    print(i)
    url = urlfirst + str(i)
    try:
        response = get(url)
        if(response.status_code == 200):
            text = response.text
    except RequestException as e:
        print(e)
    pattern = "\"Chapterid\"\: ([\d]+)"
    result = re.findall(pattern,text)
    for id in result:
        chapter = "http://m.ziyouge.com/read/1402/"+str(id)
        try:    
            response = get(chapter)
            html = etree.HTML(response.text)
            result = html.xpath(".//article/text()")
            for r in result:
                k += r
        except RequestException as e:
            print(e)
with open("我们纯真的青春.txt","w+",encoding="utf8")as f:
    f.write(k)
    

 

  • 58
    点赞
  • 351
    收藏
    觉得还不错? 一键收藏
  • 23
    评论
好的,我可以为您介绍一下如何使用 Python 爬虫爬取房产数据并保存到本地。 首先,您需要选择一个合适的网站来进行爬取。例如,可以选择链家网、安居客等房产网站。然后,您需要分析该网站的页面结构和数据请求方式,确定需要爬取哪些数据,以及如何获取这些数据。 接着,您可以使用 Python 的 requests 库来发送 HTTP 请求,获取网页内容。然后,可以使用 BeautifulSoup 库来解析网页内容,提取需要的数据。 最后,您可以使用 Python 的 Pandas 库将数据保存到本地的 Excel 或 CSV 文件。以下是一个示例代码: ```python import requests from bs4 import BeautifulSoup import pandas as pd # 发送 HTTP 请求获取网页内容 url = 'https://bj.lianjia.com/ershoufang/' headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} response = requests.get(url, headers=headers) soup = BeautifulSoup(response.content, 'html.parser') # 解析网页内容,提取需要的数据 house_list = soup.find_all('div', {'class': 'info'}) data = [] for house in house_list: name = house.find('div', {'class': 'title'}).text.strip() price = house.find('div', {'class': 'price'}).text.strip() area = house.find('div', {'class': 'houseInfo'}).text.strip() data.append([name, price, area]) # 将数据保存到本地文件 df = pd.DataFrame(data, columns=['名称', '价格', '面积']) df.to_excel('house_data.xlsx', index=False) ``` 这是一个简单的示例代码,您可以根据您需要爬取的数据和网站的不同来进行修改和优化。
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值