python爬虫零基础入门必会项目

前言

本文将以最简单粗暴的方式让你了解写python爬虫的基本流程【下载《笔趣阁》网络小说《伏天氏》】,涉及到内库或第三方库的基本方法不会详细讲解,如有需要可关注留言(根据情况考虑专门写一篇爬虫常用库的讲解),也可自行查阅。【本文只针对未入门且想了解python爬虫的小伙伴】

网络爬虫简介

网络爬虫,也叫网络蜘蛛(Web Spider)。它根据网页地址(URL)爬取网页内容,而网页地址(URL)就是我们在浏览器中输入的网址。
比如:https://www.baidu.com/,就是一个URL。在讲爬虫实战之前,我们需要先了解写爬虫的必备技能:
审查元素(如果了解过HTML,可忽略这部分内容)。

准备工作

  1. python安装(强烈推荐Anaconda,如果需要请关注微信公众号机器学习与Python编程,后台回复Anaconda即可)
  2. urllib库是python内置的,无需安装,只要安装了Python就可以使用这个库。requests、Beautiful Soup库是第三方库,需要我们自己pip install requests、pip install Beautiful Soup4来安装(这时候如果安装Anaconda的好处就来了,这两个库都不需要单独安装!!)。

牛刀小试

  1. 第一步,获取第一章的HTML信息。URL:https://www.jupindai.com/book/87/27486785.html
    代码如下
# -*- coding: utf-8 -*-
"""
Created on Sat Mar 28 14:57:15 2020
@author: Acc²
"""
import requests
if __name__ == "__main__":
#爬取<伏天氏>第一章
    url = "https://www.jupindai.com/book/87/27486785.html"
    req = requests.get(url)
    req.encoding = req.apparent_encoding #避免中文乱码
print(req.text)

以下是运行结果:
在这里插入图片描述
这就是第一章的html信息了。如何把我们需要的内容从这些众多的html标签中提取出来呢?接着往下看。。。

  1. 第二步:提取正文
    仔细观察网站源码,我们可以发现:class属性为panel-body的div标签唯一。这个标签里面存放的内容,是我们需要的部分。这样,我们就可以使用Beautiful Soup提取我们需要的内容了,代码如下:
# -*- coding: utf-8 -*-
"""
Created on Sat Mar 28 14:57:15 2020
@author: Acc²
"""
import requests
from bs4 import BeautifulSoup
if __name__ == "__main__":
#爬取<伏天氏>第一章
    url = "https://www.jupindai.com/book/87/27486785.html"
    req = requests.get(url)
    req.encoding = req.apparent_encoding #避免中文乱码
    html = req.text
    bf = BeautifulSoup(html)
#获得html信息中所有class属性为panel-body的div标签
    texts = bf.find_all('div', class_ = 'panel-body')
#提取匹配结果后,使用text属性,提取文本内容,滤除br标签。随后使用replace方法,剔除空格,替换为回车进行分段。 
#在html中是用来表示空格的。replace('\xa0'*8,'\n\n')就是去掉八个空格符号,并用回车代替
print(texts[0].text.replace('\xa0'*8,'\n\n')) # find_all匹配的返回的结果是一个列表

运行结果如下:在这里插入图片描述
可以看到,我们已经匹配到了所有正文内容,并进行了分段。而要想下载整本小说,就需要获取每个章节的链接,下面我们继续。。。。

Python爬虫实例

  1. 分析:通过审查元素,我们发现可以发现,这些章节都存放在了class属性为panel panel-default的div标签下。也就是说每章的链接放在了class属性为panel panel-default的div 标签下的a标签中。具体位置是html->body->div->dl->dd->a的href属性中。先匹配class属性为panel panel-default的div标签,再匹配a标签。
  2. 有了前面的铺垫,接下来我贴出完整的代码,如果依然有不明白的地方,欢迎以任何方式联系我交流。
# -*- coding:UTF-8 -*- 
from bs4 import BeautifulSoup 
import requests, sys 
"""
类说明:下载《笔趣阁》网络小说《伏天氏》
"""
class downloader(object):
    def __init__(self):
        self.server = 'https://www.jupindai.com/'
        self.target = 'https://www.jupindai.com/book/87.html'
        self.names = []            #章节名
        self.urls = []            #章节链接
        self.nums = 0            #章节数    
        """
    	函数说明:获取下载链接
   	"""
    def get_download_url(self):
        req = requests.get(url = self.target)
        req.encoding = req.apparent_encoding #转为utf-8编码
        html = req.text
        div_bf = BeautifulSoup(html)
        div = div_bf.find_all('div', class_ = 'panel panel-default')
        a_bf = BeautifulSoup(str(div))
        a = a_bf.find_all('a')
        self.nums = len(a[4:])     #剔除不必要的章节,并统计章节数(根据需要修改)
        for each in a[4:]:
            self.names.append(each.string)
            self.urls.append(self.server + each.get('href'))    """
    函数说明:获取章节内容
    Parameters:
        target - 下载连接(string)
    Returns:
        texts - 章节内容(string)
    """
    def get_contents(self, target):
        req = requests.get(url = target)
        req.encoding = req.apparent_encoding #转为utf-8编码
        html = req.text
        bf = BeautifulSoup(html)
        texts = bf.find_all('div', class_ = 'panel-body')
        texts = texts[0].text.replace('\xa0'*8,'\n\n')
        return texts    
        """
    	函数说明:将爬取的文章内容写入文件
    	Parameters:
    	name - 章节名称(string)
        path - 当前路径下,小说保存名称(string)
        text - 章节内容(string)
    	"""
    def writer(self, name, path, text):
        write_flag = True
        with open(path, 'a', encoding='utf-8') as f:
            f.write(name + '\n')
            f.writelines(text)
            f.write('\n\n')if __name__ == "__main__":
    dl = downloader()
    dl.get_download_url()
    print('《伏天氏》开始下载:')
    for i in range(dl.nums):
        dl.writer(dl.names[i], '伏天氏.txt', dl.get_contents(dl.urls[i]))
        sys.stdout.write("  已下载:%.3f%%" %  float(i/dl.nums*100) + '\r')
        sys.stdout.flush()
    print('《伏天氏》下载完成。欢迎关注微信公众:机器学习与Python编程')
    

在这里插入图片描述
接下来等着下载完就好了。如果只是为了学习,那么下载个几章看看效果也就OK了。
希望这篇文章能对你入门爬虫有一定的帮助,后面也会继续在公众号和博客上更新一些关于机器学习与Python编程的文章。若觉得有那么一点帮助,欢迎支持下下,谢谢!!
如有问题,欢迎留言。如有错误,欢迎指正,感谢!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章