胖头猫游戏提供热门游戏下载和手游攻略!

揭秘Python爬虫技巧:轻松获取起点中文网免费小说资源

发布时间:2024-10-17浏览:76

urllib2

模拟http请求获取html

BeautifulSoup

根据选择器获取dom结点,可查看css选择器

抓取逻辑

1.查看起点免费小说列表:https://www.qidian.com/free/all

2.先搞懂一本书的抓取逻辑

2.1 根据选择器获取到书的链接和书名

bookCover = book.select("div[class='book-mid-info'] h4 > a")[0]

利用css选择器,直接定位到我们需要的div。

2.2 创建并打开文件

bookFile = open("crawler/books/" + bookCover.string + ".txt", "a+")

使用"a+"模式打开,如果不存在就创建这个文件,如果存在,就追加内容。创建的txt文件名也就是抓取到的dom结点的text

2.3 跳转到正文内容

先获取到"div[class='book-mid-info'] h4 > a" 这个结点的href地址,然后获取到返回内容,如下图

再获取到免费试读这个结点的href,再获取它的返回内容

2.4 递归获取到每一张的内容,写入文件

通过class获取到结点内容,然后再获取到下一章的href然后递归获取每章内容。

如果没有下一页而是书末页就说明已经最后一章了,递归结束,一本书的内容也就获取完毕了。

循环获取当前页的每本书内容

每本书其实都是一个li标签,先获取到所有的li然后按照第二步进行遍历。

循环获取所有页面的书

当当前页面所有的书本都抓取完毕了,那么我们可以获取下>对应的href然后获取到返回内容,继续循环抓取。

直到抓取到最后一页,>这个dom结点的class会增加一个为lbf-pagination-disabled,可以根据这个来判断是否为最后一页。

成品展示

完整代码

# coding=utf-8import urllib2import sysfrom bs4 import BeautifulSoup#设置编码reload(sys)sys.setdefaultencoding('utf-8')startIndex = 0 #默认第0本startPage = 0 #默认第0页#获取一个章节的内容def getChapterContent(file,url): try: bookContentRes = urllib2.urlopen(url) bookContentSoup = BeautifulSoup(bookContentRes.read(), "html.parser") file.write(bookContentSoup.select("h3[class='j_chapterName']")[0].string + '\n') for p in bookContentSoup.select(".j_readContent p"): file.write(p.next + '\n') except BaseException: #如果出错了,就重新运行一遍 print(BaseException.message) getChapterContent(file, url) else: chapterNext = bookContentSoup.select("a#j_chapterNext")[0] if chapterNext.string != "书末页": nextUrl = "https:" + chapterNext["href"] getChapterContent(file,nextUrl)#获取当前页所有书的内容def getCurrentUrlBooks(url): response = urllib2.urlopen(url) the_page = response.read() soup = BeautifulSoup(the_page, "html.parser") bookArr = soup.select("ul[class='all-img-list cf'] > li") global startIndex if startIndex > 0: bookArr = bookArr[startIndex:] startIndex = 0 for book in bookArr: bookCover = book.select("div[class='book-mid-info'] h4 > a")[0] print "书名:" + bookCover.string # 先创建.txt文件,然后获取文本内容写入 bookFile = open("crawler/books/" + bookCover.string + ".txt", "a+") bRes = urllib2.urlopen("https:" + bookCover['href']) bSoup = BeautifulSoup(bRes.read(), "html.parser") bookContentHref = bSoup.select("a[class='red-btn J-getJumpUrl ']")[0]["href"] getChapterContent(bookFile, "https:" + bookContentHref) bookFile.close() nextPage = soup.select("a.lbf-pagination-next")[0] return nextPage["href"]if len(sys.argv)==1: passelif len(sys.argv) == 2: startPage = int(sys.argv[1])/20 #从第几页开始下载 startIndex = int(sys.argv[1])%20 # 从第几本开始下载elif len(sys.argv) > 2: startPage = int(sys.argv[1]) startIndex = int(sys.argv[2])#根据传入参数设置从哪里开始下载url = "//www.qidian.com/free/all?orderId=&vip=hidden&style=1&pageSize=20&siteid=1&pubflag=0&hiddenField=1&page="+str(startPage+1)#死循环 直到没有下一页while True: if url.startswith("//"): url = getCurrentUrlBooks("https:" + url) else: break;

用户评论

念旧是个瘾。

这标题不错!我一直在想办法自动下载小说的,这下可以试试用 Python 了!

    有16位网友表示赞同!

素婉纤尘

玩밌겠어! 스크레이핑으로 중국 문학을 즐겨봐볼까?

    有7位网友表示赞同!

|赤;焰﹏゛

有点儿可惜,我只看英语小说... 希望以后有英文版的教程吧!

    有12位网友表示赞同!

裸睡の鱼

Python 我会一点儿,但抓取网站这种东西没怎么接触过。学习一下这个课程就好了!

    有11位网友表示赞同!

迁心

起点的免费小说还不错,如果能用 Python 下载的话那太方便了!

    有10位网友表示赞同!

浮殇年华

看来我得好好学习一下 Python 编程了,这样才能享受更多的小说福利!

    有12位网友表示赞同!

陌上蔷薇

下载小说真的不用费时间手动去复制粘贴啦!Python 简直太厉害了!

    有5位网友表示赞同!

话扎心

有没有教程可以抓取其他网站的小说呢?

    有14位网友表示赞同!

空谷幽兰

我想学习 Python 的小伙伴们赶紧来学啊!效率飞快,而且很有用的技能!

    有18位网友表示赞同!

该用户已上天

起点中文网的很多小说我都想看,但是下载太慢了。试试这个 Python 教程吧!

    有5位网友表示赞同!

铁树不曾开花

Python 真是个好工具,有很多实用功能!以前我还没想过可以用它来抓取小说呢。

    有13位网友表示赞同!

七级床震

这种教程看起来很吸引人,希望可以轻松上手!

    有7位网友表示赞同!

沐晴つ

我已经会用 Python 写简单的代码了,但没尝试过抓取网站。期待这个教程能给我带来新的技能!

    有16位网友表示赞同!

在哪跌倒こ就在哪躺下

对学习者来说,这是一个很好的入门项目,可以了解 Python 抓取网站的基本原理。

    有11位网友表示赞同!

幸好是你

学习 Python 的过程中总是充满乐趣!而且还能通过Python来帮助我们解决一些实际问题!

    有14位网友表示赞同!

旧爱剩女

我以前就一直在找方法自动下载小说,真希望能找到一个简单的教程呢!

    有9位网友表示赞同!

惦着脚尖摘太阳

现在有很多资源可以学习 Python 了,这是一个很好的机会!

    有13位网友表示赞同!

恰十年

期待能够学完这个Python教程之后能像个高手一样轻松抓取小说了!

    有8位网友表示赞同!

金橙橙。-

我觉得这很有用,我会推荐给其他喜欢看小说的朋友们!

    有18位网友表示赞同!

热点资讯