手把手带你爬虫 | 爬取起点小说网
很多同学都喜欢看小说,尤其是程序员群体,对武侠小说,科幻小说都很着迷,最近的修仙的小说也很多,比如凡人修仙传,武动乾坤,斗破苍穹等等,今天分享一个用Python来爬取小说的小脚本!
目标
爬取一本仙侠类的小说下载并保存为txt文件到本地。本例为“大周仙吏”。
项目准备
软件:Pycharm
第三方库:requests,fake_useragent,lxml
网站地址:https://book.qidian.com
网站分析
打开网址:
网址变为:https://book.qidian.com/info/1020580616#Catalog
判断是否为静态加载网页,Ctrl+U打开源代码,Ctrl+F打开搜索框,输入:第一章。
在这里是可以找到的,判定为静态加载。
反爬分析
同一个ip地址去多次访问会面临被封掉的风险,这里采用fake_useragent,产生随机的User-Agent请求头进行访问。
代码实现
1.导入相对应的第三方库,定义一个class类继承object,定义init方法继承self,主函数main继承self。
import requests
from fake_useragent import UserAgent
from lxml import etree
class photo_spider(object):
def __init__(self):
self.url = 'https://book.qidian.com/info/1020580616#Catalog'
ua = UserAgent(verify_ssl=False)
#随机产生user-agent
for i in range(1, 100):
self.headers = {
'User-Agent': ua.random
}
def mian(self):
pass
if __name__ == '__main__':
spider = qidian()
spider.main()
2.发送请求,获取网页。
def get_html(self,url):
response=requests.get(url,headers=self.headers)
html=response.content.decode('utf-8')
return html
3.获取图片的链接地址。
import requests
from lxml import etree
from fake_useragent import UserAgent
class qidian(object):
def __init__(self):
self.url = 'https://book.qidian.com/info/1020580616#Catalog'
ua = UserAgent(verify_ssl=False)
for i in range(1, 100):
self.headers = {
'User-Agent': ua.random
}
def get_html(self,url):
response=requests.get(url,headers=self.headers)
html=response.content.decode('utf-8')
return html
def parse_html(self,html):
target=etree.HTML(html)
links=target.xpath('//ul[@class="cf"]/li/a/@href')#获取链接
names=target.xpath('//ul[@class="cf"]/li/a/text()')#获取每一章的名字
for link,name in zip(links,names):
print(name+'\t'+'https:'+link)
def main(self):
url=self.url
html=self.get_html(url)
self.parse_html(html)
if __name__ == '__main__':
spider=qidian()
spider.main()
打印结果:
4.解析链接,获取每一章内容。
def parse_html(self,html):
target=etree.HTML(html)
links=target.xpath('//ul[@class="cf"]/li/a/@href')
for link in links:
host='https:'+link
#解析链接地址
res=requests.get(host,headers=self.headers)
c=res.content.decode('utf-8')
target=etree.HTML(c)
names=target.xpath('//span[@class="content-wrap"]/text()')
results=target.xpath('//div[@class="read-content j_readContent"]/p/text()')
for name in names:
print(name)
for result in results:
print(result)
打印结果:(下面内容过多,只贴出一部分。)
5.保存为txt文件到本地。
with open('F:/pycharm文件/document/' + name + '.txt', 'a') as f:
for result in results:
#print(result)
f.write(result+'\n')
效果显示:
打开文件目录:
完整代码
import requests
from lxml import etree
from fake_useragent import UserAgent
class qidian(object):
def __init__(self):
self.url = 'https://book.qidian.com/info/1020580616#Catalog'
ua = UserAgent(verify_ssl=False)
for i in range(1, 100):
self.headers = {
'User-Agent': ua.random
}
def get_html(self,url):
response=requests.get(url,headers=self.headers)
html=response.content.decode('utf-8')
return html
def parse_html(self,html):
target=etree.HTML(html)
links=target.xpath('//ul[@class="cf"]/li/a/@href')
for link in links:
host='https:'+link
#解析链接地址
res=requests.get(host,headers=self.headers)
c=res.content.decode('utf-8')
target=etree.HTML(c)
names=target.xpath('//span[@class="content-wrap"]/text()')
results=target.xpath('//div[@class="read-content j_readContent"]/p/text()')
for name in names:
print(name)
with open('F:/pycharm文件/document/' + name + '.txt', 'a') as f:
for result in results:
#print(result)
f.write(result+'\n')
def main(self):
url=self.url
html=self.get_html(url)
self.parse_html(html)
if __name__ == '__main__':
spider=qidian()
spider.main()
程序员GitHub,现已正式上线! 接下来我们将会在该公众号上,专注为大家分享GitHub上有趣的开源库包括Python,Java,Go,前端开发等优质的学习资源和技术,分享一些程序员圈的新鲜趣事。
推荐阅读:
这个GitHub 1400星的Git魔法书火了,斯坦福校友出品丨有中文版 贼 TM 好用的 Java 工具类库 超全Python IDE武器库大总结,优缺点一目了然! 秋招来袭!GitHub28.5颗星!这个汇聚阿里,腾讯,百度,美团,头条的面试题库必须安利! 收获10400颗星!这个Python库有点黑科技,竟然可以伪造很多'假'的数据! 牛掰了!这个Python库有点逆天了,竟然能把图片,视频无损清晰放大!
点这里,获取一大波福利
评论