利用requests+pyquery/selenium爬取塔读网站的小说(解决JS渲染的问题)

news/2024/5/20 13:54:24/文章来源:https://wardseptember.blog.csdn.net/article/details/86680083

文章目录

  • 一、环境依赖
  • 二、实现
    • 1. 基本原理
    • 2. selenium代码
    • 3. requests+pyquery实现代码
    • 4. 总结
      • 一些问题
  • 三、源码下载

一、环境依赖

安装requests,selenium,pyquery模块,并下载chromedriver,配置好环境。

#python3
pip install requests selenium pyquery

我的selenium配置笔记

#如果用browser = webdriver.Chrome()报错,可以尝试以下命令
options = webdriver.ChromeOptions()
options.add_argument('--disable-extensions')
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')
options.add_argument("window-size=1024,768")
browser = webdriver.Chrome(options=options)#镜像文件,根据chrome版本对应下载chromedriver
http://npm.taobao.org/mirrors/chromedriver/
sudo mv chromedriver /usr/bin

二、实现

1. 基本原理

因为http://www.tadu.com/存在JS渲染问题,直接用requests.get()并不能爬取到小说内容,并且请求时必须加上headers,也就是User-Agent,用于骗过反爬措施。
在这里插入图片描述
某一章节,切换到preview,见下图
在这里插入图片描述
可以看到并没有章节内容,如果直接请求某一章节的url并不能得到我们想要东西。
解决这类问题,有两种办法,一是用selenium(可以模拟浏览器),这样就能得到所有完整的源代码;二是用继续分析,看看在哪里请求的章节内容,如果能找到正确url就解决问题了。

2. selenium代码

# -*- coding: utf-8 -*-
__author__ = 'wardseptember'
__date__ = '19-01-27'import requests
import os
from pyquery import PyQuery as pq
import time
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By# from selenium.webdriver.support.ui import WebDriverWait
# from selenium.webdriver.support import expected_conditions as EC'''
爬取塔读文学(http://www.tadu.com)上的小说
此例子爬取"聊斋志异"
'''#如果想爬取其他书籍只需更改bookUrl
bookUrl = 'http://www.tadu.com/book/catalogue/735'
chapterDict = {}
bookName = ''
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/71.0.3578.98 Safari/537.36'
}
browser = webdriver.Chrome()  # 启动浏览器,可以发现弹出一个浏览器# 获取所有章节标题和链接
def getChapterDict(url):try:html = requests.get(url, timeout=100, headers=headers)html.encoding = html.apparent_encodingcontent = html.contentdoc = pq(content)global bookNamebookName = doc('#container .right .book-detail.catalog-tip h1 a').text()items = doc('#container .right .detail-chapters ul li h5 a').items()for item in items:chapterDict[item.text().strip()] = 'http://www.tadu.com' + item.attr('href')except Exception as e:print(str(e))def getChapter(chapterUrl):# 获取网页内容try:browser.get(chapterUrl)time.sleep(3)# 等网页加载完成,才能获得text,继续向下进行text = browser.find_element(By.CSS_SELECTOR, '.main_ .text-content-.f-l .article_.c-3').text# 处理所的内容,使其更整洁text = text.replace('\n', '\n\n    ')text = '    ' + textreturn textexcept Exception as e:print(str(e))return " "# 写入txt文件
def writeToTxt():global bookNamebookName = bookName + '.txt'with open(bookName, 'w', encoding='utf-8') as f:f.close()try:for chapterName, value in chapterDict.items():text = getChapter(value)with open(bookName, 'a', encoding='utf-8') as f:f.write(chapterName + '\n\n\n')f.write(text + '\n')print(bookName[:-4] + ':' + chapterName + '-->写入成功')f.close()print("所有章节写入完成")except Exception as e:print(str(e))def main():getChapterDict(bookUrl)writeToTxt()browser.close()if __name__ == '__main__':main()

运行截图
在这里插入图片描述

3. requests+pyquery实现代码

继续上面所说,既然JS渲染使我们不能直接get到章节内容,那么就去找渲染的内容。
在这里插入图片描述
在preview下逐个查看url,可以看到,这个比较长的名字就是我们所要的内容。
切换到Headers,可以看到url
在这里插入图片描述
在切换到elements,ctrl+f可以全局搜索,输入刚才url,如e5cb3bfe508be412d823e0590090bd86或着http://m.tadu.com/_book_part/e5cb3bfe508be412d823e0590090bd86
结果如下
在这里插入图片描述
那么我们直接解析到这个value的值接解决问题了,现在我们访问一下http://m.tadu.com/_book_part/e5cb3bfe508be412d823e0590090bd86
如图
在这里插入图片描述
这就是我们想要的东西,乱码不要紧,utf-8编码一下就行了。
下面上代码

# -*- coding: utf-8 -*-
__author__ = 'wardseptember'
__date__ = '19-01-27'import requests
import os
from pyquery import PyQuery as pq
import time'''
爬取塔读文学(http://www.tadu.com)上的小说
此例子爬取"聊斋志异"
'''bookUrl='http://www.tadu.com/book/catalogue/735'
chapterDict={}
bookName=''
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/71.0.3578.98 Safari/537.36'
}def getChapterDict(url):try:html = requests.get(url, timeout=100,headers=headers)html.encoding = html.apparent_encodingcontent = html.contentdoc = pq(content)global bookNamebookName=doc('#container .right .book-detail.catalog-tip h1 a').text()items=doc('#container .right .detail-chapters ul li h5 a').items()for item in items:chapterDict[item.text().strip()]='http://www.tadu.com'+item.attr('href')except Exception as e:print(str(e))def getChapter_2(chapterUrl):try:html=requests.get(chapterUrl,timeout=100,headers=headers)html.encoding=html.apparent_encodingcontent=html.contentdoc=pq(content)textUrl=doc('body #bookPartResourceUrl').attr('value')htmlTxt=requests.get(textUrl,timeout=100,headers=headers)con=htmlTxt.contenthtmlstr=con.decode('utf-8')[19:-3]doc_2=pq(htmlstr)items=doc_2('p').items()text='    'for item in items:text=text+item.text()+'\n'text = text.replace('\n', '\n\n    ')return textexcept Exception as e:print(str(e))return " "def writeToTxt():global bookNamebookName=bookName+'.txt'with open(bookName, 'w', encoding='utf-8') as f:f.close()try:for chapterName,value in chapterDict.items():text=getChapter_2(value)with open(bookName,'a',encoding='utf-8') as f:f.write(chapterName+'\n\n\n')f.write(text+'\n')print(bookName[:-4]+':'+chapterName+'-->写入成功')f.close()print("所有章节写入完成")except Exception as e:print(str(e))def main():getChapterDict(bookUrl)writeToTxt()if __name__=='__main__':main()

运行截图
在这里插入图片描述

4. 总结

测试后可以发现,第一种方法比第二种慢一点,可以自行选择所用方法。

一些问题

  • 因为用字典存章节名和链接,遍历字典时得到的内容不是按顺序的,不过对聊斋志异没有影响。可以用列表分别存储,或者用yield处理解决这个问题。
  • 其他没什么问题。欢迎优化斧正代码。

三、源码下载

我所写的python爬虫代码都托管在github上,欢迎star,谢谢。
另外个人博客同步更新。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_833459.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python采集某网站内容, m3u8内容下载

前言 嗨喽&#xff0c;大家好呐&#xff01;这里是魔王~ 环境使用: Python 3.8 <建议最好是和一样版本>Pycharm 模块使用: import requests >>> pip install requests 内置模块 你安装好python环境就可以了 import reimport json 如果安装python第三方…

python带你采集不可言说网站数据,并带你多重骚操作~

前言 嗨喽&#xff0c;大家好呀&#xff0c;这里是魔王呐~ 今天我们采集国内知名的shipin弹幕网站&#xff01; 这里有及时的动漫新番,活跃的ACG氛围,有创意的Up主。 大家可以在这里找到许多欢乐。 目录&#xff08;可根据个人情况点击你想看的地方&#x1f497;&#xff0…

【python】批量高速获取 Instagram,一个简单的外国分享网站

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ! Instagram&#xff08;照片墙&#xff09;是一款运行在移动端上的社交应用&#xff0c;以一种快速、美妙和有趣的方式将你随时抓拍下的图片彼此分享&#xff0c;Facebook公司旗下社交应用 本篇文章主要是如何“批量高速获取”I…

SQL注入-攻入Apple ID钓鱼网站实录

之前写的一篇利用SQL注入方式攻击钓鱼网站的文章&#xff0c;现在在博客园再分享一下。 下午&#xff0c;朋友发了一条朋友圈&#xff0c;内容大概这样&#xff1a; 大体就是她的iPhone丢了&#xff0c;收到了钓鱼短信&#xff0c;多么熟悉的套路&#xff0c;如下&#xff1a; …

CNAME关联githubPage域名及中文域名,创建个人网站

对于前端开发来说&#xff0c;部署一个自己的个人网站部署服务器等比较麻烦&#xff0c;如果只是做静态页面的展示GitHubPage完全够用&#xff0c;而且有300M免费的空间&#xff0c;完全满足需求。 首先你要有GitHubPage项目&#xff0c;具体怎么搭建不在这里说了,前端小白也可…

网站发布-noip

使用no-ip发布网站 本文使用no-ip进行域名的申请与绑定以及最后网站的发布。 用户注册 域名申请 选择My Account 选择Dynamic DNS 选择Create Hostname 创建网站名 输入自己想要的Hostname选择DomainRecord Type正常选A&#xff0c;其他的根据自己需求 创建完成 域名配…

高并发高流量网站架构

Web2.0的兴起&#xff0c;掀起了互联网新一轮的网络创业大潮。以用户为导向的新网站建设概念&#xff0c;细分了网站功能和用户群&#xff0c;不仅成功的造就了一大批新生的网站&#xff0c;也极大的方便了上网的人们。但Web2.0以用户为导向的理念&#xff0c;使得新生的网站有…

制作个人音乐网站

转载于:https://www.cnblogs.com/big-bang3/p/8056870.html

谈谈用ASP.NET开发的大型网站有哪些架构方式(成本)

在上篇文章里(http://www.cnblogs.com/ms0017/archive/2011/07/26/2117676.html)&#xff0c;列举了国内外用ASP.NET开发的大型网站有哪些。最后提到了用.NET开发的大型网站和LAMP/JAVA平台的成本比较。其实在很多时候&#xff0c;收费的不一定就比免费的成本更高。因为开发一个…

大型网站系统架构的演化

前言 一个成熟的大型网站&#xff08;如淘宝、京东等&#xff09;的系统架构并不是开始设计就具备完整的高性能、高可用、安全等特性&#xff0c;它总是随着用户量的增加&#xff0c;业务功能的扩展逐渐演变完善的&#xff0c;在这个过程中&#xff0c;开发模式、技术架构、设计…

大型网站技术架构

架构演变第一步&#xff1a;物理分离webserver和数据库 最开始&#xff0c;由于某些想法&#xff0c;于是在互联网上搭建了一个网站&#xff0c;这个时候甚至有可能主机都是租借的&#xff0c;但由于这篇文章我们只关注架构的演变历程&#xff0c;因此就假设这个时候已经是托管…

大型网站技术架构

内容目录&#xff1a;1.初始架构2.应用服务与数据分离3.使用缓存改善网站性能4.应用服务器集群化5.数据库读写分离6.使用反向代理和CDN7.使用分布式FS和分布式DBS8.使用NoSQL和搜索引擎9.业务拆分附&#xff1a;思维导图《大型网站技术架构》读书笔记 - 网站的技术升级路线 本文…

大型网站的架构设计图分享

&#xfeff;&#xfeff;近段时间以来&#xff0c;通过接触有关海量数据处理和搜索引擎的诸多技术&#xff0c;常常见识到不少精妙绝伦的架构图。除了每每感叹于每幅图表面上的绘制的精细之外&#xff0c;更为架构图背后所隐藏的设计思想所叹服。个人这两天一直在搜集各大型网…

也谈大型电子商务网站的架构

&#xfeff;&#xfeff; 看了onecan的 大型Java多用户商城系统设计开发的心得和困难&#xff1a; http://www.iteye.com/topic/1119514 体会或说同感较多&#xff0c;由于那个帖子太长了&#xff0c;所以我把自己的一些心得另开一个来谈。 帖子上大家对是否使用Hibernate有很…

大型电子商务网站架构

&#xfeff;&#xfeff;大型电子商务网站架构之-前端优化 1 前端优化必要性 随着互联网的发展&#xff0c;前端优化越来越被人们重视&#xff0c;在一个大型的大型电子商务网站技术架构中&#xff0c;前端架构一定是一项必不可少的工作&#xff0c;国内几个大型的互联网…

大型网站架构系列:电商网站架构案例

http://www.360doc.com/content/16/0224/12/9075092_537000092.shtml 大型网站架构是一个系列文档&#xff0c;欢迎大家关注。本次分享主题&#xff1a;电商网站架构案例。从电商网站的需求&#xff0c;到单机架构&#xff0c;逐步演变为常用的&#xff0c;可供参考的分布式架构…

大型网站技术架构演变过程

前言 我们以javaweb为例&#xff0c;来搭建一个简单的电商系统&#xff0c;看看这个系统可以如何一步步演变。 该系统具备的功能&#xff1a; 用户模块&#xff1a;用户注册和管理 商品模块&#xff1a;商品展示和管理 交易模块&#xff1a;创建交易和管理 阶段一、单机构建网站…

数据结构算法网站地址

Data Structure Visualization https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

http网站转换成https网站

https&#xff0c;https的本地测试环境搭建,asp.net结合https的代码实现,http网站转换成https网站之后遇到的问题 一&#xff1a;什么是https SSL&#xff08;Security Socket Layer&#xff09;全称是加密套接字协议层&#xff0c;它位于HTTP协议层和TCP协议层之间&#x…

网站推荐(1)

网站推荐&#xff08;1&#xff09; 0x01 合集类 编程导航&#xff1a; https://www.code-nav.cn/ B站鱼皮大大开发的一个汇集编程干货的网站&#xff0c;很不错的 微共享&#xff1a; https://www.wgxxz.cn/ 也是一款资源合集的网站 0x02 实用类 Github&#xff1a;https:…