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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V:vip1024c 备注Python获取(资料价值较高,非无偿)
学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、学习软件
工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
三、全套PDF电子书
书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。
四、入门学习视频
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
五、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
六、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
tps://img-blog.csdnimg.cn/img_convert/252731a671c1fb70aad5355a2c5eeff0.png)
六、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。