このブログ記事では、侵害た場合、私に通知し、私が削除されてください、参照を読み取るために、ユーザーのみにこれを公開し、私のアマチュアのレコードを使用しています。
この記事では、任意の盗作や他の記事なしで、純粋な野生であり、他から学びます。元に密着!!
序文
こんにちは。ここでは一連の記事を放棄するエントリからPythonの爬虫類です。I SunriseCai。
この記事では、南パインおじさんのクローラのダウンロードの使用説明墓ノートフィクションの全集を。
墓は全集住所ノート:http://www.daomubiji.com/
1.記事のアイデア
以下のように墓のノートは、小説のサイトを見て:
- ホーム(1ページ)
- セクションページ(2ページ)
- テキストページ(3ページ)
これは、ダウンセットでいくつかの写真、上に見ることができるロシアの人形!!!
- アクセスホームページ(ページ)取得するために2つのページを
- アクセスセクションのページ(2ページ)取得するために身体のページを(3ページ)
- アクセステキストページ(3ページ)、エキスのテキストデータ。
- 保存したテキストデータ。
そして、これらのページを要求する方法を見てみましょう。
2.リクエスト+ページ解析
トップのノウハウにより、墓は、新規サイトのホームページがあるノート:http://www.daomubiji.com/
2.1アクセスHOME(1ページ)
浏览器打开 盗墓笔记 的首页,点击F12,进入开发者模式。看看页面结构,发现了二级页面的链接。perfect !!!那接下来就是 请求网页 以及 解析网页(提取数据)了。
- 代码实现 访问首页 获取 二级页面 链接
- 这里使用前面文章介绍过的requests请求网页 及XPath模块去 解析网页
import requests
from lxml import etree
url = 'http://www.daomubiji.com'
def get_overview():
# 访问盗墓笔记首页
res = requests.get(url)
# 如果访问状态码为200(即成功)就继续
if res.status_code == 200:
# 构造XPath解析对象
parse_html = etree.HTML(res.text)
link = parse_html.xpath('//*[@id="menu-item-1404"]/ul/li/a/@href') # 二级页面链接
name = parse_html.xpath('//*[@id="menu-item-1404"]/ul/li/a/text()') # 二级页面名称
return link, name
else:
print('your code is fail')
link,name = get_overview()
print(link, name)
# ['http://www.daomubiji.com/dao-mu-bi-ji-1', 'http://www.daomubiji.com/dao-mu-bi-ji-2',
'http://www.daomubiji.com/dao-mu-bi-ji-3', 'http://www.daomubiji.com/dao-mu-bi-ji-4',
'http://www.daomubiji.com/dao-mu-bi-ji-5', 'http://www.daomubiji.com/dao-mu-bi-ji-6',
'http://www.daomubiji.com/dao-mu-bi-ji-7', 'http://www.daomubiji.com/dao-mu-bi-ji-8',
'http://www.daomubiji.com/dao-mu-bi-ji-2015']
# ['盗墓笔记1:七星鲁王', '盗墓笔记2:秦岭神树', '盗墓笔记3:云顶天宫', '盗墓笔记4:蛇沼鬼城',
'盗墓笔记5:迷海归巢', '盗墓笔记6:阴山古楼', '盗墓笔记7:邛笼石影', '盗墓笔记8:大结局',
'盗墓笔记2015年更新']
这里已经获取到了二级页面的链接,接下来就是去访问 章节页面(二级页面) 获取 **正文页面(三级页面)**了。
2.2 访问章节页面(二级页面)
看到二级页面链接的章节目录,发现了 正文页面(三级页面),这正是我们想要的,下面用代码去实现访问 章节页面(二级页面) 获取 正文页面(三级页面)。
def get_catalogs(url):
"""
:param url: 传入二级页面的链接
:return: 返回所有章节目录于标题
"""
res = requests.get(url=url)
if res.status_code == 200:
parse_html = etree.HTML(res.text)
link = parse_html.xpath('/html/body/section/div[2]/div/article/a/@href') # 正文链接
title = parse_html.xpath('/html/body/section/div[2]/div/article/a/text()') # 正文标题
return link, title
else:
print('your code is fail')
这里获取到正文(三级页面)的链接和标题后,接下来就是请求正文了。
2.3 访问 正文页面(三级页面),提取 + 保存正文
通过下图可以发现,正文的内容都藏在article标签下面,那接下来尝试去请求该页面。
- 正文提取代码示例:
def get_content(url,title):
"""
:param url: 传入正文链接
:return: 返回正文内容
"""
res = requests.get(url=url)
if res.status_code == 200:
parse_html = etree.HTML(res.text)
content = parse_html.xpath("/html/body/section/div[1]/div/article/p/text()") # 正文内容
return title, content
else:
print('your code is fail')
get_content(url)
- 正文保存代码示例:
def save_content(content, name):
"""
:param content: 传入正文内容
:param name: 传入标题
:return:
"""
with open('%s.txt' % name, 'a', newline='') as f:
for data in content:
f.write(data+'/n') # 加一个换行,段落间需要换行
f.close()
3. 完整代码
- 这里针对上边的代码做了整合和部分修改
- 代码直接拷贝即可运行
# -*- coding: utf-8 -*-
# @Time : 2020/1/25 20:20
# @Author : SunriseCai
# @File : DaoMBJSpider.py
# @Software: PyCharm
"""盗墓笔记爬虫程序"""
import os
import requests
from lxml import etree
class DaomubijiSpider(object):
def __init__(self):
self.url_homePage = 'http://www.daomubiji.com'
self.headers = {'User-Agent': 'Mozilla/5.0'}
self.content_titles = None
self.content_links = None
def get_overview(self):
"""
:return: 访问首页,获取二级页面的标题的链接
"""
res = requests.get(self.url_homePage, headers=self.headers)
if res.status_code == 200:
parse_html = etree.HTML(res.text)
links = parse_html.xpath('//*[@id="menu-item-1404"]/ul/li/a/@href')
titles = parse_html.xpath('//*[@id="menu-item-1404"]/ul/li/a/text()')
for link, title in zip(links, titles):
self.get_catalogs(title, link)
self.get_content()
else:
print('your code is fail')
def get_catalogs(self, title, url):
"""
:param title: 传入二级页面标题
:param url: 传入二级页面链接
:return: 将解析度到的章节目录标题和链接保存到self
"""
if not os.path.exists(title):
os.makedirs(title)
res = requests.get(url=url, headers=self.headers)
if res.status_code == 200:
parse_html = etree.HTML(res.text)
self.content_links = parse_html.xpath('/html/body/section/div[2]/div/article/a/@href')
self.content_titles = [parse_html.xpath('/html/body/section/div[2]/div/article/a/text()'), title]
else:
print('your code is fail')
def get_content(self):
"""
:return: 提取正文页面的正文
"""
folder = self.content_titles[1]
for link, title in zip(self.content_links, self.content_titles[0]):
time.sleep(2) # 休眠2秒,不能给对方服务器造成太大压力
res = requests.get(url=link, headers=self.headers)
if res.status_code == 200:
parse_html = etree.HTML(res.text)
content = parse_html.xpath("/html/body/section/div[1]/div/article/p/text()")
self.save_content(folder, title, content)
else:
print('your code is fail')
def save_content(self, folder, title, content):
"""
:param folder: 传入文件夹
:param title: 传入标题
:param content: 传入正文内容
:return:
"""
with open('%s/%s.txt' % (folder, title), 'a', newline='') as f:
for data in content:
f.write(data+'\n')
f.close()
def main(self):
self.get_overview()
if __name__ == '__main__':
spider = DaomubijiSpider()
spider.main()
結果を見てみましょう:
これまでのところ、この記事の最後に。
確かに、まずまずによって書かれたこの記事は、おじさんを送信するために韓国の魅力を追体験コピーペーストコードで一部を実行することをお勧めいたします。
最後に、この章を要約します:
- 導入墓爬虫類のアイデアのウェブサイトを
- ネットワーク全体の小説をダウンロードするには、クローラの使用方法を詳細に説明
- 非常に詳細な、何か質問は以下のコメントを残してください持っています。
- ポイントの懸念が迷子にない、時計にあなたの忍耐をありがとうございました。
- 容易にするためにつつく鶏料理が参加することを歓迎しているQQグループの組織を:648 696 280
題し次の記事、「| Pythonの爬虫類戦闘-絵のネットワークをダウンロードする-決定するエントリからPythonの爬虫類は08を放棄します」。