logo_2024
萌の领域

【技术】python爬虫教程(2)

技术教程 pengpengf - 7

这次分享两个用爬虫抓小说的案例。

第一个是我之前在https://m.biquge123.com这个网站爬书的。

我也把爬的一些书发出来了:https://www.moezone.dev/130199.html

下面讲怎么分析网页的规律。

这个网站现在进去会有不安全提示。

先随便点开一本书,网页地址就变成了https://m.biquge123.com/book/98098/

点开另一本书https://m.biquge123.com/book/98097/

说明书的地址是https://m.biquge123.com/book/+书的id

点开第一章,地址为https://m.biquge123.com/book/98097/28266676.html

就说明章节排序不是简单的1 2 3这样的命名,就放弃探寻命名规律。

所以应该这样获取一本书:

获取书籍主页地址-》进入书籍主页地址获取第一章地址-》获取第一章内容-》从第一章的“下一章”按钮获取第二章地址-》……

而观察主页后,发现主页有一个“开始阅读”按钮,进去转跳的是第一章,所以这个按钮里一定有第一章的地址,用检查元素进行分析:

可以直接获取到,自己再手动加上前缀就能得到地址https://m.biquge123.com/book/98097/28266676.html

可以看到它属于一个class为book_operation的元素的第一个div的a元素的href属性。

用代码就是:第一章=分析器.find(class_=‘book_operation’).find_all(‘a’)[0][‘href’]

注意自己写的时候用英文打一遍,直接复制的可能会有中文标点符号,变量也不要和我一样用中文,用中文写程序看似很自豪,实际上效率低下。

下一步寻找下一章按钮也是一样的:

而当我们点开最后一章的时候,会发现它的下一章按钮会指向书籍主页,所以我们在获取到的地址等于主页地址的时候结束循环。

爬小说最重要的当然是正文:

可以看到,所有文字都在这id为nr1的元素里,<br>其实就是空行,不过是网页显示用的,获取到的文字只需要把<br>替换成n,把<div id=”nr1″> 和<div>替换成空字符串就行了。同时还可以替换一些字,比如说把 马蚤 替换成 骚 ,把rou替换成肉,以及文章中可能出现的水印可以去掉。

具体代码可以看https://www.moezone.dev/130199.html。

第二个案例是从http://18av.mm-cg.com/获取小说。这网站是tw的,需要翻墙,而且必须挂tw的站点。

如图,网站的黄文分为几个类型。

通过元素分析,我们可以轻松得到这几个类型的地址。

通过查看会发现,每一页有50篇,同时有下一页按钮。

我们可以通过寻找一个id为main的元素,从里面查找所有target为_blank的元素,就可以获得文章名和地址。

打开一篇小说,分析元素,文章内容在一个id为novel_content_txtsize的元素里。

那接下来的就和上一个案例差不多了。

但是,在实际写代码运行的时候却发现不是这么回事。

首先,网站设置了简单的防爬虫设置,获取的时候会出现异常。

解决也简单,在获取手动时候添加headers:

headers = {“User-Agent”: “Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36”}
request.Request(url, headers=headers)
像这样子就行了。
 
第二个问题是是,当获取到第二级页面,也就是有50篇文章的地址的网页时,会发现找不到这些地址。
看完获取的数据之后才发现,这些数据是异步加载的,同时当我用浏览器的网络选项卡分析的时候却发现什么都找不到。
无奈之下,第二级页面的处理只能交给selenium处理。
而这又导出了第四个问题。
 
我们先说第三个问题,这些小说都是繁体的,虽然是可以读,但是不是很方便,所以我们需要把它变成简体中文。
解决办法在这里https://www.cnblogs.com/tangxin-blog/p/5616415.html
 
第四个问题就是,由浏览器加载是需要加载一大堆图片的,没错就是澳门线上赌场……
导致浏览器加载速度很慢,而且因为要翻墙,加载很可能加载失败。
这意味着爬虫大部分时间会浪费在加载中。
那怎么解决呢?
多进程+多线程,老爹说过要用异步打败异步。
 
因为考虑异步,所以前面的页面是串行的,好在二级页面从第二页开始又规律,变成数字命名的了,所以我最后写成半自动的了。
代码:
from bs4 import BeautifulSoup
from langconv import *
import re
from urllib import request
from selenium import webdriver
import multiprocessing
import os
import time
from concurrent.futures import ThreadPoolExecutor
headers = {“User-Agent”: “Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36”}
rootPath = ‘E://h_novel/’
tp=ThreadPoolExecutor(max_workers=8)
if not os.path.exists(rootPath):
    os.mkdir(rootPath)
def TraditionalToSimplified(line):  # 繁体转简体
    line = Converter(“zh-hans”).convert(line)
    return line
def downloadfiction(url, fictionName, savePath):
    if os.path.exists(savePath+'{}.txt’.format(fictionName)):
        print(‘{}已存在n’.format(fictionName))
        return
    pg = request.Request(url, headers=headers)
    hml = request.urlopen(pg).read().decode(‘utf-8’, ‘ignore’)
    sup = BeautifulSoup(hml, ‘html.parser’)
    dv = sup.find(id=”novel_content_txtsize”)
    text = str(dv)
    text = re.split(‘<br/>|<br>|n’, text)
    f = open(savePath+'{}.txt’.format(fictionName), ‘w’, encoding=’utf-8′)
    for i in range(1, len(text)-1):
        f.write(TraditionalToSimplified(text[i])+’n’)
    f.close()
    print(‘{}下载完成n’.format(fictionName))
def kindsdown(kindfurl, kindname):
    savepath = rootPath+kindname+’/’
    if not os.path.exists(savepath):
        os.mkdir(savepath)
    driver = webdriver.chrome.webdriver.WebDriver()
    driver.get(kindfurl)
    driver.minimize_window()
    time.sleep(5.0)
    try:
        lefts = driver.find_element_by_class_name(‘novel_left’).find_elements_by_tag_name(‘a’)
    except:
        driver.close()
        lefts=[]
    for obj in lefts:
        novelurl = obj.get_attribute(‘href’)
        novelName = obj.text
        tp.submit(downloadfiction,novelurl, novelName,savepath)
    try:
        rights = driver.find_element_by_class_name(‘novel_right’).find_elements_by_tag_name(‘a’)
    except:
        driver.close()
        rights=[]
    for obj in rights:
        novelurl = obj.get_attribute(‘href’)
        novelName = TraditionalToSimplified(obj.text)
        tp.submit(downloadfiction,novelurl, novelName,savepath)
    driver.close()
    time.sleep(5)
if __name__ == “__main__”:
    pools = multiprocessing.Pool(processes=3)
    U=[
        [‘http://18av.mm-cg.com/students_on_campus.html’,’http://18av.mm-cg.com/serch_novel/%E5%B0%8F%E8%AA%AA_%E5%AD%B8%E7%94%9F%E6%A0%A1%E5%9C%92_’,’.htm’,59,’学生校园’],
        [‘http://18av.mm-cg.com/workplace_passion.html’,’http://18av.mm-cg.com/serch_novel/%E5%B0%8F%E8%AA%AA_%E8%81%B7%E5%A0%B4%E6%BF%80%E6%83%85_’,’.htm’,145,’职场激情’],
        [‘http://18av.mm-cg.com/experience_story.html’,’http://18av.mm-cg.com/serch_novel/%E5%B0%8F%E8%AA%AA_%E7%B6%93%E9%A9%97%E6%95%85%E4%BA%8B_’,’.htm’,80,’经验故事’],
        [‘http://18av.mm-cg.com/violent_abuse.html’,’http://18av.mm-cg.com/serch_novel/%E5%B0%8F%E8%AA%AA_%E6%9A%B4%E5%8A%9B%E8%99%90%E5%BE%85_’,’.htm’,34,’暴力虐待’],
        [‘http://18av.mm-cg.com/not_london_love.html’,’http://18av.mm-cg.com/serch_novel/%E5%B0%8F%E8%AA%AA_%E4%B8%8D%E5%80%AB%E6%88%80%E6%83%85_’,’.htm’,169,’不伦恋情’],
        [‘http://18av.mm-cg.com/groups_companion.html’,’http://18av.mm-cg.com/serch_novel/%E5%B0%8F%E8%AA%AA_%E7%BE%A4%E9%AB%94%E6%8F%9B%E4%BC%B4_’,’.htm’,15,’群体换伴’],
        [‘http://18av.mm-cg.com/wife_mature.html’,’http://18av.mm-cg.com/serch_novel/%E5%B0%8F%E8%AA%AA_%E4%BA%BA%E5%A6%BB%E7%86%9F%E5%A5%B3_’,’.htm’,158,’人妻熟女’],
        [‘http://18av.mm-cg.com/sciencefiction.html’,’http://18av.mm-cg.com/serch_novel/%E5%B0%8F%E8%AA%AA_%E7%A7%91%E5%AD%B8%E5%B9%BB%E6%83%B3_’,’.htm’,21,’科学幻想’],
        [‘http://18av.mm-cg.com/other_stories.html’,’http://18av.mm-cg.com/serch_novel/%E5%B0%8F%E8%AA%AA_%E5%85%B6%E4%BB%96%E6%95%85%E4%BA%8B_’,’.htm’,15,’其他故事’],
        [‘http://18av.mm-cg.com/other_fantasy.html’,’http://18av.mm-cg.com/serch_novel/%E5%B0%8F%E8%AA%AA_%E7%8E%84%E5%B9%BB%E4%BB%99%E4%BF%A0_’,’.htm’,35,’玄幻仙侠’],
        [‘http://18av.mm-cg.com/anime_modification.html’,’http://18av.mm-cg.com/serch_novel/%E5%B0%8F%E8%AA%AA_%E5%8B%95%E6%BC%AB%E4%BF%AE%E6%94%B9_’,’.htm’,5,’动漫修改’]
        [‘http://18av.mm-cg.com/long_serial.html’,’http://18av.mm-cg.com/serch_novel/%E5%B0%8F%E8%AA%AA_%E9%95%B7%E7%AF%87%E9%80%A3%E8%BC%89_’,’.htm’,9,’长篇连载’]
    ]
    for u in U:
        pools.apply_async(kindsdown,(u[1],u[4]))
    
        for i in range(2,u[3]):
            pools.apply_async(kindsdown,(u[1]+str(i)+u[2],u[4]))
    pools.close()
    pools.join()
    time.sleep(3600)#等待线程结束
我爬到的小说在:https://www.moezone.dev/168136.html
 
下一次分享用爬虫爬视频。
  • 萌の领域是一个和谐有爱的ACG文化交流圈,这里是众多二次元文化爱好者的集结地。
  • 本文章是由 萌の领域 会员 pengpengf 的创作作品。
  • 转载文章时请保留原出处,资源请重新打包!并且附上完整的地址:https://www.moezone.dev/176091.html
  • 资源分享不易,有时间的萌友可以重新打包上传一份,发链接到评论区接力分享,薪火相传呢~
  • 如资源链接失效,请先查看是否是两个星期之前的资源,超过时间默认不补档,请考虑是否要点击下载。其他情况请点击上方举报,等待管理员处理。
  • 下载之前请查看评论区,如果有人提示资源已失效请不要点击下载浪费萌币,也不要说作者骗币,下载消耗的萌币是被服务器回收了。

© 2019 - 2024 💝 Www.MoeZone.Dev