scrapy实现增量式爬取(1),Python开发应该了解的Binder原理

文章讲述了使用Scrapy框架进行小说信息抓取,包括书籍介绍、章节内容解析,并介绍了如何通过缓存实现增量式爬取,以及关键的XPath和正则表达式在数据提取中的应用。
摘要由CSDN通过智能技术生成

novel_UpdateTime = scrapy.Field()#最后更新时间

novel_Words = scrapy.Field() #总字数

novel_ImageUrl = scrapy.Field()#封面图片

novel_AllClick = scrapy.Field()#总点击

novel_MonthClick = scrapy.Field()#月点击

novel_WeekClick = scrapy.Field()#周点击

novel_AllComm = scrapy.Field()#总推荐

novel_MonthComm = scrapy.Field()#月推荐

novel_WeekComm = scrapy.Field()#周推荐

novel_Url = scrapy.Field()#小说url

novel_Introduction = scrapy.Field()#小说简介

2.ChapterItem

class ChapterItem(scrapy.Item):

chapter_Url = scrapy.Field()#章节url

_id = scrapy.Field()#章节id

novel_Name = scrapy.Field()#小说名称

chapter_Name = scrapy.Field()#章节名称

chapter_Content = scrapy.Field()#内容

novel_ID = scrapy.Field()#小说id

is_Error = scrapy.Field()#是否异常

2.解析信息

这里我是用的是scrapy自带的通用爬虫模块,只需要指定信息解析方式,需要跟进的url就够了

1.指定需要跟进的url和回调函数

allowed_domains = [“23us.so”] #允许爬取的域名

start_urls = [“http://www.23us.so/xiaoshuo/414.html”]#种子url

#跟进的url

rules=(

Rule(LinkExtractor(allow=(“xiaoshuo/\d*.html”)),callback=“parse_book_message”,follow=True),

Rule(LinkExtractor(allow=(“files/article/html/\d*?/\d*?.index.html”)),callback=“parse_book_chapter”,follow=True),

Rule(LinkExtractor(allow=(“files/article/html/\d*?/\d*?/\d*?.html”)),callback=“parse_chapter_content”,follow=True),

Rule(LinkExtractor(allow=(“.*”)),follow=True),

)

2.解析方法
1.解析书籍信息方法

#解析小说信息页面

def parse_book_message(self,response):

if not response.body:

print(response.url+“已经被爬取过了,跳过”)

return;

ht = response.body.decode(“utf-8”)

text = html.fromstring(ht)

novel_Url = response.url

novel_Name = text.xpath(“.//dl[@id=‘content’]/dd[1]/h1/text()”)[0].split(" “)[0] if response.xpath(”.//dl[@id=‘content’]/dd[1]/h1/text()") else “None”

novel_ImageUrl = text.xpath(“.//a[@class=‘hst’]/img/@src”)[0] if response.xpath(“.//a[@class=‘hst’]/img/@src”) else “None”

novel_ID = int(response.url.split(“/”)[-1].split(“.”)[0]) if response.url.split(“/”)[-1].split(“.”) else “None”

novel_Type = text.xpath(“.//table[@id=‘at’]/tr[1]/td[1]/a/text()”) if response.xpath(“.//table[@id=‘at’]/tr[1]/td[1]/a/text()”) else “None”

novel_Writer = “”.join(text.xpath(“.//table[@id=‘at’]/tr[1]/td[2]/text()”)) if response.xpath(“.//table[@id=‘at’]/tr[1]/td[2]/text()”) else “None”

novel_Status = “”.join(text.xpath(“.//table[@id=‘at’]/tr[1]/td[3]/text()”)) if response.xpath(“.//table[@id=‘at’]/tr[1]/td[3]/text()”) else “None”

novel_Words = self.getNumber(“”.join(text.xpath(“.//table[@id=‘at’]/tr[2]/td[2]/text()”))) if response.xpath(“.//table[@id=‘at’]/tr[2]/td[2]/text()”) else “None”

novel_UpdateTime = “”.join(text.xpath(“.//table[@id=‘at’]/tr[2]/td[3]/text()”)) if response.xpath(“.//table[@id=‘at’]/tr[2]/td[3]/text()”) else “None”

novel_AllClick = int(“”.join(text.xpath(“.//table[@id=‘at’]/tr[3]/td[1]/text()”))) if response.xpath(“.//table[@id=‘at’]/tr[3]/td[1]/text()”) else “None”

novel_MonthClick = int(“”.join(text.xpath(“.//table[@id=‘at’]/tr[3]/td[2]/text()”))) if response.xpath(“.//table[@id=‘at’]/tr[3]/td[2]/text()”) else “None”

novel_WeekClick = int(“”.join(text.xpath(“.//table[@id=‘at’]/tr[3]/td[3]/text()”))) if response.xpath(“.//table[@id=‘at’]/tr[3]/td[3]/text()”) else “None”

novel_AllComm = int(“”.join(text.xpath(“.//table[@id=‘at’]/tr[4]/td[1]/text()”))) if response.xpath(“.//table[@id=‘at’]/tr[4]/td[1]/text()”) else “None”

novel_MonthComm = int(“”.join(text.xpath(“.//table[@id=‘at’]/tr[4]/td[3]/text()”))) if response.xpath(“.//table[@id=‘at’]/tr[4]/td[2]/text()”) else “None”

novel_WeekComm = int(“”.join(text.xpath(“.//table[@id=‘at’]/tr[4]/td[3]/text()”))) if response.xpath(“.//table[@id=‘at’]/tr[4]/td[3]/text()”) else “None”

pattern = re.compile(‘

(.*)<br’)

match = pattern.search(ht)

novel_Introduction = “”.join(match.group(1).replace(" “,”")) if match else “None”

#封装小说信息类

bookitem = BookItem(

novel_Type = novel_Type[0],

novel_Name = novel_Name,

novel_ImageUrl = novel_ImageUrl,

_id = novel_ID, #小说id作为唯一标识符

novel_Writer = novel_Writer,

novel_Status = novel_Status,

novel_Words = novel_Words,

novel_UpdateTime = novel_UpdateTime,

novel_AllClick = novel_AllClick,

novel_MonthClick = novel_MonthClick,

novel_WeekClick = novel_WeekClick,

novel_AllComm = novel_AllComm,

novel_MonthComm = novel_MonthComm,

novel_WeekComm = novel_WeekComm,

novel_Url = novel_Url,

novel_Introduction = novel_Introduction,

)

return bookitem

2.解析章节信息

def parse_chapter_content(self,response):

if not response.body:

print(response.url+“已经被爬取过了,跳过”)

return;

ht = response.body.decode(‘utf-8’)

text = html.fromstring(ht)

soup = BeautifulSoup(ht)

novel_ID = response.url.split(“/”)[-2]

novel_Name = text.xpath(“.//p[@class=‘fr’]/following-sibling::a[3]/text()”)[0]

chapter_Name = text.xpath(“.//h1[1]/text()”)[0]

‘’’

chapter_Content = “”.join(“”.join(text.xpath(“.//dd[@id=‘contents’]/text()”)).split())

if len(chapter_Content) < 25:

chapter_Content = “”.join(“”.join(text.xpath(“.//dd[@id=‘contents’]//*/text()”)))

pattern = re.compile(‘dd id=“contents”.?>(.?)’)

match = pattern.search(ht)

chapter_Content = “”.join(match.group(1).replace(" “,”").split()) if match else “爬取错误”

‘’’

result,number = re.subn(“<.*?>”,“”,str(soup.find(“dd”,id=‘contents’)))

chapter_Content = “”.join(result.split())

print(len(chapter_Content))

novel_ID = response.url.split(“/”)[-2]

return ChapterItem(

chapter_Url = response.url,

_id=int(response.url.split(“/”)[-1].split(“.”)[0]),

novel_Name=novel_Name,

chapter_Name=chapter_Name,

chapter_Content= chapter_Content,

novel_ID = novel_ID,

is_Error = len(chapter_Content) < 3000

)

3.scrapy中实现增量式爬取的几种方式
1.缓存

通过开启缓存,将每个请求缓存至本地,下次爬取时,scrapy会优先从本地缓存中获得response,这种模式下,再次请求已爬取的网页不用从网络中获得响应,所以不受带宽影响,对服务器也不会造成额外的压力,但是无法获取网页变化的内容,速度也没有第二种方式快,而且缓存的文件会占用比较大的内存,在setting.py的以下注释用于设置缓存

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img



既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V:vip1024c 备注Python获取(资料价值较高,非无偿)
img

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

五、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

tps://img-blog.csdnimg.cn/img_convert/252731a671c1fb70aad5355a2c5eeff0.png)

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值