scrapycrawl 爬取笔趣阁小说

前言



第一次发到博客上..不太会排版见谅

最近在看一些爬虫教学的视频,有感而发,大学的时候看盗版小说网站觉得很能赚钱,心想自己也要搞个,正好想爬点小说能不能试试做个网站(网站搭建啥的都不会...)

站点拥有的全部小说不全,只能使用crawl爬全站

不过写完之后发现用scrapy爬的也没requests多线程爬的快多少,保存也不好一本保存,由于scrapy是异步爬取,不好保存本地为txt文件,只好存mongodb            捂脸

下面是主代码

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from biquge5200.items import Biquge5200Item

class BqgSpider(CrawlSpider):
    name = ‘bqg‘
    allowed_domains = [‘bqg5200.com‘]
    start_urls = [‘https://www.bqg5200.com/‘]

    rules = (
        Rule(LinkExtractor(allow=r‘https://www.bqg5200.com/book/\d+/‘),
            follow=True),
        Rule(LinkExtractor(allow=r‘https://www.bqg5200.com/xiaoshuo/\d+/\d+/‘),
             follow=False),
        Rule(LinkExtractor(allow=r‘https://www.bqg5200.com/xiaoshuo/\d+/\d+/\d+/‘),
             callback=‘parse_item‘, follow=False),
    )

    def parse_item(self, response):

        name = response.xpath(‘//div[@id="smallcons"][1]/h1/text()‘).get()
        zuozhe = response.xpath(‘//div[@id="smallcons"][1]/span[1]/text()‘).get()
        fenlei = response.xpath(‘//div[@id="smallcons"][1]/span[2]/a/text()‘).get()

        content_list = response.xpath(‘//div[@id="readerlist"]/ul/li‘)
        for li in content_list:
            book_list_url = li.xpath(‘./a/@href‘).get()
            book_list_url = response.urljoin(book_list_url)

            yield scrapy.Request(book_list_url,
                                 callback=self.book_content,
                                 meta={‘info‘:(name,zuozhe,fenlei)})

    def book_content(self,response):
        name, zuozhe, fenlei,= response.meta.get(‘info‘)
        item = Biquge5200Item(name=name,zuozhe=zuozhe,fenlei=fenlei)

        item[‘title‘] = response.xpath(‘//div[@class="title"]/h1/text()‘).get()

        content = response.xpath(‘//div[@id="content"]//text()‘).getall()
        # 试试可不可以把 列表前两个值不要 取[2:]
        content = list(map(lambda x:x.replace(‘\r\n‘,‘‘),content))
        content = list(map(lambda x: x.replace(‘ads_yuedu_txt();‘, ‘‘), content))
        item[‘content‘] = list(map(lambda x: x.replace(‘\xa0‘, ‘‘), content))

        item[‘url‘] = response.url

        yield item

items.py

import scrapy

class Biquge5200Item(scrapy.Item):

    name = scrapy.Field()
    zuozhe = scrapy.Field()
    fenlei = scrapy.Field()
    title = scrapy.Field()
    content = scrapy.Field()
    url = scrapy.Field()

middlewares.py

import user_agent

class Biquge5200DownloaderMiddleware(object):

    def process_request(self, request, spider):
        request.headers[‘user-agent‘] = user_agent.generate_user_agent()

这是当初看视频学到随机useragent库,但是忘记到底是怎么导入的了....

由于网站没有反爬,我只习惯性谢了个user-agent, 有需要你们到时候自己写一个ua和ip的把..

Pipeline.py
# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don‘t forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html

import pymongo

class Biquge5200Pipeline(object):

    def open_spider(self,spider):

        self.client = pymongo.MongoClient()
        self.db = self.client.bqg

    def process_item(self, item, spider):
        name = item[‘name‘]
        zuozhe = item[‘zuozhe‘]
        fenlei = item[‘fenlei‘]

        coll = ‘ ‘.join([name,zuozhe,fenlei])

        self.db[coll].insert({"_id":item[‘url‘],
                              "title":item[‘title‘],
                              "content":item[‘content‘]})

        return item

    def close_spider(self, spider):
        self.client.close()

将获取到的item中书名,作者,分类作为数据库的集合名,将_id替换为item[‘url‘],之后可以用find().sort("_id":1)排序,默认存储在本地的mongodb中,

windows端开启mongodb,开启方式--->>net start mongodb

linux端不太清楚,请百度

settings.py

BOT_NAME = ‘biquge5200‘

SPIDER_MODULES = [‘biquge5200.spiders‘]
NEWSPIDER_MODULE = ‘biquge5200.spiders‘

DEFAULT_REQUEST_HEADERS = {
  ‘Accept‘: ‘text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8‘,
  ‘Accept-Language‘: ‘en‘,
}

DOWNLOADER_MIDDLEWARES = {
   ‘biquge5200.middlewares.Biquge5200DownloaderMiddleware‘: 543,
}
ITEM_PIPELINES = {   ‘biquge5200.pipelines.Biquge5200Pipeline‘: 300,}
 

完成...








如果嫌弃爬的慢,使用scrapy_redis分布式,在本机布置几个分布式,适用于只有一台电脑,我默认你安装了scrapy_redis

现在settings.py中 添加几个参数

#使用Scrapy-Redis的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
#利用Redis的集合实现去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
#允许继续爬取
SCHEDULER_PERSIST = True
#设置优先级
SCHEDULER_QUEUE_CLASS = ‘scrapy_redis.queue.SpiderPriorityQueue‘

REDIS_HOST = ‘localhost‘      # ---------> 本机ip
REDIS_PORT = 6379

在主程序中将以下代码

class BqgSpider(CrawlSpider):
    name = ‘bqg‘
    allowed_domains = [‘bqg5200.com‘]
    start_urls = [‘https://www.bqg5200.com/‘]

改为

from scrapy_redis.spiders import RedisCrawlSpider    # -----> 导入

class BqgSpider(RedisCrawlSpider):            # ------> 改变爬虫父类
    name = ‘bqg‘
    allowed_domains = [‘bqg5200.com‘]
    # start_urls = [‘https://www.bqg5200.com/‘]

    redis_key = ‘bqg:start_urls‘          # ------> 记住这个redis终端有用,格式 一般写爬虫名:start_urls

开启mongodb

开启redis服务 ---->>> 进入redis安装目录  redis-server.exe  redis.windows.conf

多开几个cmd窗口进入爬虫文件主程序文件中执行       scrapy runspider 爬虫名         ,爬虫进入监听状态

开启reids终端 --->>> redis-cli.exe

输入启动启动名称和url,是你需要开始爬取的页面

调试完成可以等待爬虫爬取了




多台主机爬取,需要看将那一台主机作为主机端,将settings.py中REDIS_HOST改为主机端的ip

保存的数据存储在哪也要考虑,如果直接保存在每台爬虫端,不需要要改动,如果想要汇总到一台机器上,

在Pipeline.py中修改

mongoclient(host="汇总数据的ip",post="monodb默认端口")

将修改好的文件复制每台爬虫端开启,汇总数据的电脑开启mongodb ,主机端开启redis服务,进入终端 输入 lpush 爬虫名:start_urls  url

原文地址:https://www.cnblogs.com/zengxm/p/10810562.html

时间: 2024-11-08 23:44:39

scrapycrawl 爬取笔趣阁小说的相关文章

用爬虫爬取笔趣阁小说

#时间 2019年3月4日19:16:06 #功能:爬取笔趣阁任何小说. from urllib import request from bs4 import BeautifulSoup #此函数用来获取每章对应的小说,并保存小说 def secondOpenURL(url,ch_name): # 请求每章详细内容 date = request.urlopen(url).read().decode('gbk') soup = BeautifulSoup(date, 'html.parser').

Python 爬取笔趣阁小说

最近在学习 Python,觉得爬虫很好玩,今天我准备爬取我看了至少三遍的小说<雪中悍刀行>,作者是烽火戏诸侯,他的小说很有才华,有着很多的粉丝,但他很多部小说都处于断更状态,因此人称大内总管. 我准备爬取小说的网站是新笔趣阁,这里一个盗版网站,是名门正派的眼中钉,不过对于我这种不想交钱看小说的人,没资格评论它,这个网站连载的小说更新的还是比较快的,内容都是和正版的内容一模一样.好了,废话不多说了,下面开始放代码: 我在抓取小说内容时先用了 requests 库来抓取,结果就抓到了一章小说的开头

爬取笔趣阁小说

<修罗武神>是在17K小说网上连载的网络小说,作者为善良的蜜蜂.小说讲述了一个少年从下界二等门派外门弟子成长为上界翘楚人物的故事.该书曾入选“第三届橙瓜网络文学奖”百强作品. 编程只是实现目的的工具. 所以重点是分析我们的需求. 获取小说目录页面是基本.这里有各个章节的链接,标题等等内容.这是我们需要的. 有了各个章节的链接,就需要进入其中获得各个章节的内容. 1.首先是爬取网站的内容 1 def get_content(url): 2 3 try: 4 headers = { 5 'User

python应用:爬虫框架Scrapy系统学习第四篇——scrapy爬取笔趣阁小说

使用cmd创建一个scrapy项目: scrapy startproject project_name (project_name 必须以字母开头,只能包含字母.数字以及下划线<underscorce>) 项目目录层级如下: 声明Item 声明我们可能用到的所有字段,包括管理字段等.管理字段可以让我们清楚何时(date).何地(url server)及如何(spider)执行爬去,此外,还可以自动完成诸如使item失效.规划新的抓取迭代或是删除来自有问题的爬虫的item. 管理字段 Pytho

多线程爬取笔趣阁免费小说全站爬取

import threading,os,time,requests,pymongo,refrom queue import Queuefrom lxml import etreefrom bs4 import BeautifulSoup as BPclient = pymongo.MongoClient(host='localhost',port=27017)mg = client['biquge']def get_fenlei(): """ 爬取图书全部分类 :return

Python 爬取笔趣看小说

# -*- coding:utf-8 -*- from bs4 import BeautifulSoup import requests import sys class DownLoader(object): def __init__(self): self.server = 'http://www.biqukan.com/' self.target = 'http://www.biqukan.com/0_790/' self.header = {'User-Agent': 'Mozilla/

python入门学习之Python爬取最新笔趣阁小说

Python爬取新笔趣阁小说,并保存到TXT文件中      我写的这篇文章,是利用Python爬取小说编写的程序,这是我学习Python爬虫当中自己独立写的第一个程序,中途也遇到了一些困难,但是最后迎刃而解了.这个程序非常的简单,程序的大概就是先获取网页的源代码,然后在网页的源代码中提取每个章节的url,获取之后,在通过每个url去获取文章的内容,在进行提取内容,然后就是保存到本地,一TXT的文件类型保存.大概是这样1:获取网页源代码2:获取每章的url3:获取每章的内容4:下载保存文件中 1

免app下载笔趣阁小说

这个是对最近学习的一次总结吧.前两天写的,今天才有时间写博客. 偶然点开笔趣阁的网址(https://www.biquge.cc/),突然觉得我应该可以用爬虫实现小说下载.有这个想法我就开始尝试了. 爬虫呀,说白了就是程序自动模拟浏览器操作来获取网页的内容. 先用F12查看元素,查看章节网址链接,和章节正文内容. 结构很简单. 想法很快就有了,通过网站的搜索打开小说详情页,然后获取每一章的网址url,依次访问每一章网址,再通过正则表达式匹配章节内容, 最后将匹配的内容保存到本地. 中间忘了一个小

笔趣阁小说-雪中悍刀行-爬虫源代码

1 import re 2 import requests 3 from bs4 import BeautifulSoup 4 5 url = 'http://www.biquge6.com/11_11147/' 6 r = requests.get(url) 7 b = BeautifulSoup(r.content.decode('gbk')) 8 h = b.find_all(href = re.compile('/11_11147/')) #正则匹配属性值带有/104_104216/的h