Python scrapy爬取起点中文网小说榜单
作者:超哥-- 发布时间:2022-11-06 14:34:11
标签:Python,爬取,小说
一、项目需求
爬取排行榜小说的作者,书名,分类以及完结或连载
二、项目分析
目标url:“https://www.qidian.com/rank/hotsales?style=1&page=1”
通过控制台搜索发现相应信息均存在于html静态网页中,所以此次爬虫难度较低。
通过控制台观察发现,需要的内容都在一个个li列表中,每一个列表代表一本书的内容。
在li中找到所需的内容
找到第两页的url
“https://www.qidian.com/rank/hotsales?style=1&page=1”
“https://www.qidian.com/rank/hotsales?style=1&page=2”
对比找到页数变化
开始编写scrapy程序。
三、程序编写
创建项目太简单,不说了
1.编写item(数据存储)
import scrapy
class QidianHotItem(scrapy.Item):
name = scrapy.Field() #名称
author = scrapy.Field() #作者
type = scrapy.Field() #类型
form= scrapy.Field() #是否完载
2.编写spider(数据抓取(核心代码))
#coding:utf-8
from scrapy import Request
from scrapy.spiders import Spider
from ..items import QidianHotItem
#导入下需要的库
class HotSalesSpider(Spider):#设置spider的类
name = "hot" #爬虫的名称
qidian_header={"user-agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"} #设置header
current_page = 1 #爬虫起始页
def start_requests(self): #重写第一次请求
url="https://www.qidian.com/rank/hotsales?style=1&page=1"
yield Request(url,headers=self.qidian_header,callback=self.hot_parse)
#Request发起链接请求
#url:目标url
#header:设置头部(模拟浏览器)
#callback:设置页面抓起方式(空默认为parse)
def hot_parse(self, response):#数据解析
#xpath定位
list_selector=response.xpath("//div[@class='book-mid-info']")
#获取所有小说
for one_selector in list_selector:
#获取小说信息
name=one_selector.xpath("h4/a/text()").extract()[0]
#获取作者
author=one_selector.xpath("p[1]/a[1]/text()").extract()[0]
#获取类型
type=one_selector.xpath("p[1]/a[2]/text()").extract()[0]
# 获取形式
form=one_selector.xpath("p[1]/span/text()").extract()[0]
item = QidianHotItem()
#生产存储器,进行信息存储
item['name'] = name
item['author'] = author
item['type'] = type
item['form'] = form
yield item #送出信息
# 获取下一页URL,并生成一个request请求
self.current_page += 1
if self.current_page <= 10:#爬取前10页
next_url = "https://www.qidian.com/rank/hotsales?style=1&page="+str(self.current_page)
yield Request(url=next_url,headers=self.qidian_header,callback=self.hot_parse)
def css_parse(self,response):
#css定位
list_selector = response.css("[class='book-mid-info']")
for one_selector in list_selector:
# 获取小说信息
name = one_selector.css("h4>a::text").extract()[0]
# 获取作者
author = one_selector.css(".author a::text").extract()[0]
# 获取类型
type = one_selector.css(".author a::text").extract()[1]
# 获取形式
form = one_selector.css(".author span::text").extract()[0]
# 定义字典
item=QidianHotItem()
item['name']=name
item['author'] = author
item['type'] = type
item['form'] = form
yield item
3.start.py(代替命令行)
在爬虫项目文件夹下创建start.py。
from scrapy import cmdline
#导入cmd命令窗口
cmdline.execute("scrapy crawl hot -o hot.csv" .split())
#运行爬虫并生产csv文件
出现类似的过程代表爬取成功。
hot.csv
来源:https://blog.csdn.net/weixin_50835854/article/details/117783644


猜你喜欢
- 关于opencvOpenCV 是 Intel 开源计算机视觉库 (Computer Version) 。它由一系列 C 函数和少量 C++
- 本文实例分析了JS限制条件补全问题。分享给大家供大家参考,具体如下:题目一.a和b两个变量,不用第三个变量来切换两个变量值var a=5;v
- 因为我使用的是mmsql数据库,因为遇到一点坑,所以发布出来。准备工作:https://www.lfd.uci.edu/~gohlke/py
- 最近在学习django,学到第五章模型时,需要连接数据库,然后,在这里分享一下方法。起初是不知道怎样配置mysql数据库,但是还好,djan
- 本文实例讲述了JavaScript实现彩虹文字效果的方法。分享给大家供大家参考。具体如下:<HTML><HEAD>&
- 目的:删除文件之后,如果目录为空,递归删除为空的目录。svr.dataDir指目录的最外层,递归删除目录的时候判断到这一层即可。eg:/Us
- on和where的区别多表查询语法结构:table_reference {[INNER] JOIN | {LEFT|RIGHT} [OUTE
- 前言 BeautifulSoup是主要以解析web网页的Python模块,它会提供一些强大的解释器,以解
- 西贝做了许久的交互设计工作,每年的目标都有不同,却发现今年没有什么提高和改进的地方。也许是自己没有回头总结,总是被这样那样的借口推脱。最近休
- 切片:切片指从现有列表中,获取一个子列表返回一个新列表,不影响原列表。下标以 0 开始:list = ['红','绿
- python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认
- enumerate函数用于遍历序列中的元素以及它们的下标。enumerate函数说明:enumerate()是python的内置函数enum
- 支持按照文件夹去批量处理,也可以单独一个文件进行处理,并且可以自定义标识符最近在开发一个答题类的小程序,到了录入试题进行测试的时候了,发现一
- 1. Mysql binlog参数配置log-bin=mysql-bin打开二进制日志功能,默认在datadir下binlog-ignore
- 前言相关性分析算是很多算法以及建模的基础知识之一了,十分经典。关于许多特征关联关系以及相关趋势都可以利用相关性分析计算表达。其中常见的相关性
- 想找一个可以播放文字的闹钟找不到,自己写一个更简单。TTS实现由很多种办法,百度等都提供了API接口,但类似百度,需要先注册等一系列动作。其
- 本文实例讲述了python开启多个子进程并行运行的方法。分享给大家供大家参考。具体如下:这个python代码创建了多个process子进程,
- 利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456from fun
- 本文实例讲述了C# Ado.net读取SQLServer数据库存储过程列表及参数信息的方法。分享给大家供大家参考,具体如下:得到数据库存储过
- 在用plt.imshow和cv2.imshow显示同一幅图时可能会出现颜色差别很大的现象。这是因为:opencv的接口使用BGR,而matp