Reptile:requests + BeautifulSopu 实现古诗词网三国名著下载
2019/1/25凌晨?路飛學城爬蟲課程,requests + BeautifulSoup?庫實現中國古詩詞網站名著《三國演義》的下載
BeautifulSoup?庫是一種常用的網頁解析庫,可以對網頁數據進行解析得到自己想要的數據,一下為基礎方法:
屬性和方法:
soup = BeautifulSoup(響應對象文本html,‘lxml')
1.根據標簽名進行查找:
-soup.a?對對象中的a標簽進行查找,只能返回找到的第一個
2.?獲取屬性:
- soup.a.attrs?獲取a?標簽下所有的屬性值,對應找到的第一個標簽下所有的屬性值,返回一個字典類型
- soup.a.attrs['href']?獲取a標簽下指定的href屬性值
- soup.a['href']?作用同上 (簡寫方式,常用)
3.?獲取內容:
- soup.a.string?獲取a標簽的直屬文本,也就是只能獲取a標簽本身的文本內容,再下一級的就獲取不到了
- soup.a.text?獲取a標簽下的所有內容,獲取a標簽及其下級標簽的文本內容
- soup.a.get_text()?效果同上,具體差異不清楚
4. find:?找到第一個符合要求的標簽
- suop.find('a')?找到第一個符合要求的a標簽并返回
- soup.find('a', title='xxx')?可以指定標簽的屬性,同上也是返回找到的第一個
可以作用到屬性,類、ID等
5. findAll:找到所有符合要求的標簽 (A?不可小寫,小寫會報錯)
- soup.findAll('a')?找到對象中所有的a標簽并返回一個列表
- soup.findAll('a','b')?找到對象中所有的a和b標簽
- soup.findAll('a', title='xxx')?找到對象中所有符合要求的a標簽
6.根據選擇器選擇指定的內容
- soup.select()?適用與對css選擇器比較熟悉的,雖然我不熟悉,但是我覺得這個很好用啊
- soup.select('.xxx li')?表示某個標簽下的所有的a標簽
7.還有子、子孫,父、祖先,兄弟節點等
- soup.a.contents?獲取a標簽下所有的子節點,子節點的子節點獲取不了
- soup.a.children?獲取a標簽下的所有的節點。
-?soup.a.descendants?獲取a標簽下的所有的子節點對應的子節點
-?soup.a.parent?獲取a標簽的父級節點
-?soup.a.parents?獲取a標簽的所有的上級節點直到文檔的最頂層
-?soup.a.next_siblings?獲取a標簽的下一個兄弟節點(平行節點?)這個我到現在都沒有搞明白
?soup.a.previous siblings?獲取a標簽的上一個兄弟節點(平行節點?)同上這個我還是沒有搞明白
?
需求:獲取古詩詞網的名著數據,并寫入
標題也就是章節名和對應的內容不是在一個URL下的,所以要先解析出標題和標題內的URL,再對URL再次發起請求獲取對應的內容
# -*- coding: utf-8 -*- # ------ wei、yu ------# 需求:爬取詩詞名句網的歷史典籍全部import requests from bs4 import BeautifulSoup import os import time import random# 生成文件目錄 if not os.path.exists('./History Books'):os.mkdir("History Books")def _book_list(url):book_list_response = requests.get(url=url, headers=headers)if book_list_response.status_code == 200:book_list_text = book_list_response.text# 調用Beautiful解析出書名列表,和書名對應的urlsoup = BeautifulSoup(book_list_text, 'lxml')bookInfo = soup.select('.bookmark-list a')book_list_response.close()return bookInfoelse:print('內容數據請求失敗,請重新嘗試')exit()def _title_list(url):title_list_response = requests.get(url=url, headers=headers)if title_list_response.status_code == 200:title_list_text = title_list_response.text# 調用Beautiful解析出章節列表和章節對應的內容urlsoup = BeautifulSoup(title_list_text, 'lxml')titleList = soup.select('.book-mulu a')title_list_response.close()return titleListelse:print('內容數據請求失敗,請重新嘗試')exit()def _content(url):content_response = requests.get(url=url, headers=headers)if content_response.status_code == 200:content_text = content_response.text# 調用Beautiful解析出章節對應的內容soup = BeautifulSoup(content_text, 'lxml')content1 = soup.find('div', class_='chapter_content')content_response.close()return content1.get_text()else:print('內容數據請求失敗,請重新嘗試')exit()# 指定url和請求頭參數 home_page_url = 'http://www.shicimingju.com/book/' headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/65.0.3325.181 Safari/537.36' } while 1:try:# 首先調用_book_list對首頁鏈接發起請求,獲得返回的書名列表booklists = _book_list(home_page_url)# 獲取書名和書名對應的完整urlfor info in booklists:bookName = info.string # 書名bookUrl = 'http://www.shicimingju.com' + info['href'] # 書名對應的完整url# 生成書名對應的文件句柄,每本書生成一個文件fileInfo = "History Books/" + str(bookName) + '.txt'fp = open(fileInfo, 'w', encoding='utf-8')for i in range(random.randint(0, 5)):print('\033[1;34m 數據請求中.....\033[m')time.sleep(0.2)print('\033[1;31m 數據請求成功,開始下載.....\033[m')time.sleep(0.2)# 接下來調用_title_list對書名對應的url發起請求,獲得返回的章節標題titlelists = _title_list(bookUrl)# 獲取章節名稱和章節對應的完整urlfor title in titlelists:titleName = title.string # 章節名稱titleUrl = 'http://www.shicimingju.com' + title['href'] # 章節對應的完整url# 接下來調用 _content 對章節對應的url發起請求,獲得返回的內容數據content = _content(titleUrl)try:fp.write(titleName + ":" + content + '\n\n')print('\033[34m %s \033[m \033[31m %s \033[m 寫入完成..' % (bookName, titleName))time.sleep(0.1)except:print('\n \033[1;31m 數據寫入異常,跳過.. \033[m \n')print('\033[1;31m 重新嘗試接入.. \033[m')time.sleep(2)fp.close()exit('獲取完成,程序結束')except:print('\n 10053 錯誤! \n ') # 這里不知道為什么會報一個10053的錯誤,網上搜索了一下看說是網絡問題還是啥的,沒有解決,這樣循環會出現一旦報錯就會重寫全部文件,很麻煩,一開始在公司測試的時候沒有什么問題,在家的時候才出現的continue?
轉載于:https://www.cnblogs.com/wei-yu/p/10319123.html
總結
以上是生活随笔為你收集整理的Reptile:requests + BeautifulSopu 实现古诗词网三国名著下载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 忽然出现的wsappx占用了几乎所有内存
- 下一篇: apache+php安装教程