小说爬取 python + urllib + lxml

from urllib import parse
from urllib import request
from lxml import etree
import time

class Novel:
    def __init__(self,*args):
        self.name = args[0]
        self.dict = args[1]
        self.txt = ‘‘
        for key in sorted(self.dict):
            self.txt = self.txt + self.dict[key]

    def write(self):
        f = open(self.name+‘.txt‘,‘w‘)
        f.write(self.txt)
        f.close()

#获取网页源代码
def get_http_page(url,**kw):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36"
    }
    req = request.Request(url,headers=headers)
    response = request.urlopen(req)
    page = response.read()
    encoding = ‘gbk‘
    if kw:
        encoding = kw[‘encoding‘]
    page = page.decode(encoding)
    return page

#获取漫画目录
def get_comics_directory(url):
    url_list = []
    page = get_http_page(url,encoding=‘utf-8‘)
    html = etree.HTML(page)
    result = html.xpath(‘/html/body/div[2]/div/div[2]/h3/a‘)
    elment_select = None
    if len(result):
        url2 = result[0].get(‘href‘)
    if url2:
        page = get_http_page(url2)
        html = etree.HTML(page)
        elment_select = html.xpath(‘/html/body/div[4]/div[9]/span[2]/select‘)
        if len(elment_select):
            result_option = elment_select[0].findall(‘option‘)
            for option in result_option:
                url_list.append(‘https://m.wenxuemi6.com{}‘.format(option.get(‘value‘)))
    return url_list

def downdload_txt(url_list,**kw):
    if kw:
        start = int(kw[‘start‘])
        stop = int (kw[‘stop‘])
        if start >= 0 and start < len(url_list) and stop > start and stop <len(url_list):
            count = kw[‘start‘]
            count_max = kw[‘stop‘]
    else:
        count = 0
        count_max = len(url_list)
    print(‘正在爬取目录和章节地址,请稍等……‘)
    d = {}
    while count < count_max:
        url = url_list[count]
        page = get_http_page(url)
        html = etree.HTML(page)
        result = html.xpath(‘/html/body/div[4]/ul[2]/li/a‘)
        txt = ‘‘
        if type(result).__name__ == ‘list‘:
            for l in result:
                url = ‘https://m.wenxuemi6.com{}‘.format(l.get(‘href‘))
                #url_list.append(‘https://m.wenxuemi6.com{}‘.format(l.get(‘href‘)))
                print(‘Download chapters by URL:{}‘.format(url))
                d2 = {‘{}‘.format(count): ‘‘}
                page = get_http_page(url)
                html = etree.HTML(page)
                url_next = html.xpath(‘//*[@id="pb_next"]‘)
                t = html.xpath(‘//*[@id="nr1"]/text()‘)
                t2 = html.xpath(‘//*[@id="nr1"]/p‘)
                txt_title = ‘‘
                txt_title_list = html.xpath(‘//*[@id="nr_title"]/text()‘)
                if type(txt_title_list).__name__ == ‘list‘:
                    if (len(txt_title_list) == 1):
                        txt_title = txt_title_list[0]
                txt = txt + txt_title + ‘\r\n‘
                for l2 in t:
                    txt = txt + l2 + ‘\r\n‘
                if type(t2).__name__ == ‘list‘:
                    if len(t2) == 1:
                        url = ‘https://m.wenxuemi6.com{}‘.format(l.get(‘href‘)[:-5] + ‘_2.html‘)
                        print(‘Download chapters by URL:{}‘.format(url))
                        page = get_http_page(url)
                        html = etree.HTML(page)
                        t = html.xpath(‘//*[@id="nr1"]/text()‘)
                        for l2 in t:
                            txt = txt + l2 + ‘\r\n‘
                d2[‘{}‘.format(count)] = txt
                d.update(d2)
                time.sleep(1)
    return d

if __name__ == ‘__main__‘:
    txt_name = input("请输入要搜索的书名:")
    url = ‘https://m.wenxuemi6.com/search.php?keyword={}‘.format(parse.quote(txt_name))
    referer = url
    url_list = get_comics_directory(url)
    #下载第一页目录下的小说
    d = downdload_txt(url_list,start=0,stop=1)
    n1 = Novel(txt_name,d)
    #写出文件 [txt_name].txt 到当前目录下
    n1.write()

    #下载全本小说
    d2 = downdload_txt(url_list,start=0,stop=1)
    n2 = Novel(txt_name,d2)
    #写出文件 [txt_name].txt 到当前目录下
    n2.write()

原文地址:https://www.cnblogs.com/Dmail/p/11615049.html

时间: 2024-10-17 08:42:36

小说爬取 python + urllib + lxml的相关文章

python爬虫之小说爬取

废话不多说,直接进入正题. 今天我要爬取的网站是起点中文网,内容是一部小说. 首先是引入库 from urllib.request import urlopen from bs4 import BeautifulSoup 然后将网址赋值 html=urlopen("http://read.qidian.com/chapter/dVQvL2RfE4I1/hJBflakKUDMex0RJOkJclQ2.html") //小说的第一章的网址 bsObj=BeautifulSoup(html)

大规模数据爬取 -- Python

Python书写爬虫,目的是爬取所有的个人商家商品信息及详情,并进行数据归类分析 整个工作流程图: 第一步:采用自动化的方式从前台页面获取所有的频道 from bs4 import BeautifulSoup import requests #1.找到左侧边栏所有频道的链接 start_url = 'http://hz.58.com/sale.shtml' url_host = 'http://hz.58.com' def get_channel_urls(url): wb_data = req

模拟登陆+数据爬取 (python+selenuim)

以下代码是用来爬取LinkedIn网站一些学者的经历的,仅供参考,注意:不要一次性大量爬取会被封号,不要问我为什么知道 #-*- coding:utf-8 -*- from selenium import webdriver from selenium.webdriver.common.keys import Keys import time from bs4 import BeautifulSoup diver=webdriver.Chrome() diver.get('https://www

scrapy爬取python职位

使用scrapy框架爬取前程无忧上的python职位 创建cmd文件:star.cmd scrapy startproject Jobs cd Jobs scrapy genspider Job51Spider www.51job.com 使用编译器打开Jobs开始项目 打开/spiders/Job51Spider.py 写入 # -*- coding: utf-8 -*- import json import re import time from scrapy import Spider,

起点中文网小说爬取-etree,xpath,os

本文章主要是lxml库的etree解析抽取与xpath解析的应用,还使用了os库写文件 import os import requests from lxml import etree#lxml库解析HTML.xml文件抽取想要的数据 #设计模式--面向对象 class Spider(object): def start_request(self): #1.请求网站拿到数据,抽取小说名创建文件夹,抽取 response=requests.get('https://www.qidian.com/a

爬虫实例——爬取python百度百科相关一千个词条

调度器: import url_manager,html_downloader,html_parser,html_outputer class SpiderMain(object): """docstring for SpiderMain""" def __init__(self): self.urls = url_manager.UrlManager() self.downloader = html_downloader.HtmlDownloa

python 爬取网络小说 清洗 并下载至txt文件

什么是爬虫 网络爬虫,也叫网络蜘蛛(spider),是一种用来自动浏览万维网的网络机器人.其目的一般为编纂网络索引. 网络搜索引擎等站点通过爬虫软件更新自身的网站内容或其对其他网站的索引.网络爬虫可以将自己所访问的页面保存下来,以便搜索引擎事后生成索引供用户搜索. 爬虫访问网站的过程会消耗目标系统资源.不少网络系统并不默许爬虫工作.因此在访问大量页面时,爬虫需要考虑到规划.负载,还需要讲“礼貌”. 不愿意被爬虫访问.被爬虫主人知晓的公开站点可以使用robots.txt文件之类的方法避免访问.这个

如何用python爬虫从爬取一章小说到爬取全站小说

前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http://t.cn/A6Zvjdun 很多好看的小说只能看不能下载,教你怎么爬取一个网站的所有小说 知识点: requests xpath 全站小说爬取思路 开发环境: 版 本:anaconda5.2.0(python3.6.5) 编辑器:pycharm 第三方库: requests parsel 进行

网络爬虫之动态内容爬取

根据联合国网站可访问性审计报告,73%的主流网站都在其重要功能中依赖JavaScript.和单页面应用的简单表单事件不通,使用JavaScript时,不再是加载后立即下载所有页面内容.这样会造成许多网页在浏览其中展示的内容不会出现在HTML源码中,针对于这种依赖于JavaScript的动态网站,我们需要采取相应方法,比如JavaScript逆向工程.渲染JavaScript等方法. 1. 动态网页示例 如上图,打开智联招聘主页,输入python,搜索会出现上面的页面,现在我们爬取上图红色标记出的