我是一個小白.剛剛開始看爬蟲先關的教程
這是我根據一個爬取豆瓣top250電影名字的教程改寫的代碼,這個代碼是有問題的,第三次運行的時候就一直開始報錯了,為什么說是第三次呢?因為我前兩次都成功的運行起來了,而且真的生成了一個1.txt檔案,里面也有爬到的電影名字,不過名字只有25個左右
import requests
from bs4 import BeautifulSoup
def getData(self):
res = requests.get(self)
html = res.text
return html
def parseData(self):
soup = BeautifulSoup(self, 'lxml')
res2 = soup.find('ol')
movieList = res2.find_all('li')
mList = []
for movie in movieList:
title = movie.find('span', class_='title').get_text()
# print(title)
mList.append(title)
with open('1.txt', 'w') as f:
for name in mList:
f.write(name + '\n')
str1 = 'https://movie.douban.com/top250?start='
str2 = '&filter='
for num in range(20):
num += 25
url = str1 + str(num) + str2
html = getData(url)
parseData(html)
運行以后報錯:
Traceback (most recent call last):
File "D:/PY/PythonStudy/爬蟲學習/top250完全版.py", line 29, in <module>
parseData(html)
File "D:/PY/PythonStudy/爬蟲學習/top250完全版.py", line 12, in parseData
movieList = res2.find_all('li')
AttributeError: 'NoneType' object has no attribute 'find_all'
遇到的問題:
1.最后的for回圈中的range()括號中寫1,寫20都可以運行,為什么呢?要寫多少才可以獲取到所有的250電影名字呢?
2.為什么前兩次可以運行,后面就開始報錯了呢?
uj5u.com熱心網友回復:
報錯log的最后一行說明當次res = requests.get(self)中的res為空。因此后續進行BeautifulSoup和find_all等操作時報'NoneType' object has no attribute 'find_all'措。為空的原因:
——1.要么是你的BeautifulSoup匹配陳述句沒得查找到正確的資料,嘗試檢查下BeautifulSoup匹配的支點是否唯一和錯漏。
——2.豆瓣服務器檢測到你的請求為爬蟲,回傳了空資料。建議為requests添加headers等引數,并設定一定的sleep時間。
另挑點小毛病:
with open('1.txt', 'w') as f:
——建議修改為:with open('1.txt', 'w', encoding='utf-8') as f: 用于指定編碼格式,否則你保存的1.txt檔案大概率亂碼。
再提點建議:
——requests請求引數多配置一點,至少把User-Agent配置上,至少偽裝一下爬蟲程式。具體可搜索關鍵字requests headers。
——代碼后續可改進封裝成類,更整潔易管理(根據你的學習進度改進)。
——BeautifulSoup決議性能相對較低,建議更換為lxml并使用xpath等進行匹配(根據你的學習進度改進)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/128782.html
上一篇:關于Windows10下Linux子系統Ubuntu的JDK環境、Hadoop環境配置以及Scala安裝中出現的問題
