導航:首頁 > 數據處理 > 豆瓣爬數據只能爬59條是為什麼

豆瓣爬數據只能爬59條是為什麼

發布時間:2022-12-28 09:14:34

㈠ 如何突破豆瓣爬蟲限制頻率

做好 cookie UA 偽裝,豆瓣帶 cookie 的抓取保持一定節奏不會被 403 ,會跳轉驗證碼,把驗證碼簡單二值化然後扔給開放的 OCR API ,然後走下英文單詞糾錯(豆瓣驗證碼基本都是英文單詞),自動識別率基本是超過 30% 。找到這個節奏的最大並發限制,然後慢慢抓,不行可以開多 ip 代理這么抓。 幾個月前抓豆瓣基本是這么寫的。先大概計算下需要抓的頁面數量級,有時候 1 秒一個頁面,慢慢抓,抓幾天也能滿足需要,不行再上代理。

㈡ 網不好爬蟲數據少

速度限制,驗證碼提示,網站結構變化。網不好爬蟲數據少改變的方法:
1、速度限制,速度限制是對抗爬蟲數據少的一種常見的方法,限制可能因網站而異,並基於在特定時間段內執行的操作數量或用戶使用的數據量。
2、驗證碼提示,驗證碼是另一種更復雜的限制網路抓取的方法。用戶可以通過在短時間內發出過多請求、未正確覆蓋網路抓取工具的指紋,或使用低質量的代理方式觸發驗證碼改變爬蟲數據少的方法。
3、網站結構變化,網站並不是一成不變的,尤其是當用戶爬取大型網站時,站點經常更改 HTML 標記,以此破壞用戶的網路抓取腳本改變爬蟲數據少的方法。

㈢ 豆瓣爬蟲顯示ip異常怎麼

豆瓣爬蟲顯示ip異常可能是爬取速度太快的原因。可以考慮降低爬取速度,定期清理cookies,使用高匿名ip,或其它微調操作。

㈣ 用request爬取數據會因為數據太多爬不全嗎,為什麼只能爬出來後面一半

這是有可能的
有可能網頁會延時載入,js渲染等,所以一般爬蟲都要循環等待
也有可能網站有反爬技術

㈤ python爬蟲爬取只顯示10個

一個借口幾萬條數據但是只返回十條_爬蟲實踐之爬取10000條菜譜數據
2020-12-03 06:37:24

weixin_39990029
碼齡5年
關注
.png
爬蟲實踐之XX行代碼爬取10000菜譜數據

什麼是爬蟲

爬蟲:又叫做 網路蜘蛛,是一段自動抓取互聯網信息的程序,從互聯網上抓取對於我們有價值的信息。
點擊這里了解Python爬蟲介紹

如何合法地爬蟲

有些網站不允許網路爬蟲,或是對可爬取的內容做了限制,一個網站的爬蟲協議可通過訪問該網站的robots.txt文件獲得

以豆瓣網為例

訪問該網址(https://www.douban.com/robots.txt),可了解到豆瓣的爬蟲協議如下

.png
可以看到,豆瓣對於不同的訪問者有不同的訪問限制,其中對於用戶名為 Wandoujia Spider的訪問者,豆瓣不允許訪問。

我用到的菜譜網站對爬蟲無限制,所以爬蟲是合法的。

.png
本篇特色

連續爬取10000個網頁

引入第三方庫

import requests #發送請求
import re #正則表達式,用於提取網頁數據
import winsound #提醒程序運行結束
import time #計算程序運行時間
如果沒有安裝這些第三方庫,可以在命令提示符中輸入如下代碼,進行下載

pip install requests,re,winsound,time
爬蟲的三個步驟

獲取要爬取的所有網頁的網址
提取網頁內容中的有用信息
信息導出
每個步驟對應一個函數

Step_1 獲取要爬取的所有網頁的網址

首先我們打開該網址,查看它的源代碼

.png
.png
網頁源代碼
觀察發現每道菜對應的網址在這個目錄下

.png
用正則表達式獲得該網址,寫入列表中

由於每一個網頁只有十道菜,點擊下一頁後發現網頁的變化規律為換頁時網址只有數字改變

.png
可以看到最多有1000頁,也就是有10000道菜

.png
使用循環,將每一頁的菜對應的網址都寫入列表,每一次寫入時寫入一行列表,多次寫入後,形成一個二維的列表,前兩頁的菜譜網址在二維列表中顯示如下:

.png
代碼如下

all_url = [] #創建一個數組用於存儲網頁地址
def get_all_url(n): #這個函數用於獲得網頁中的菜的全部網址
if(n==1):
url = "https://m.meishij.net/caixi/sucai1/"
else:
url='https://m.meishij.net/caixi/sucai1/p%s/'%n #%s相當於C語言中的%s,表示格式化一個對象為字元,同理%d表示格式化一個對象為整數
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36" }
response = requests.get(url,headers=headers) #訪問網頁
response.encoding = "utf-8" #設置接收編碼格式
pattern = re.compile(r'<a target="_blank" href="([a-zA-z]+://[^s]*)">', re.S)
#正則表達式提取網頁中的網址,re.S表示在整個文本中進行匹配,如果不加re.S,將只在一行進行匹配
result = pattern.findall(response.text) #獲取的網頁結果存儲到result里
all_url.append(result[0:10])#由於每頁只有十道菜,result中只有前十條對應的是菜的網址,故我們只添加前十條
return all_url #作為返回值返回這個列表
關於headers的說明

在使用python爬蟲爬取數據的時候,經常會遇到一些網站的反爬蟲措施,一般就是針對於headers中的User-Agent,如果沒有對headers進行設置,User-Agent會聲明自己是python腳本,而如果網站有反爬蟲的想法的話,必然會拒絕這樣的連接。而修改headers可以將自己的爬蟲腳本偽裝成瀏覽器的正常訪問,來避免這一問題。 點擊這里了解詳情

關於編碼格式utf-8 的說明

utf-8,可以編碼中文,大部分python編譯器都默認編碼方式為utf-8 點擊這里了解詳情

Step_2 提取網頁中的有用信息

打開一道菜的網址,查看源代碼,尋找我們需要的信息在哪裡,然後用正則表達式獲取,流程與上個函數獲取網址相同

主輔料信息在這里

.png
特徵信息在這里(包括做法和口味)

.png
def get_info(resp,output):
name_pattern = re.compile(r'<h1>(.*)</h1>')# 正則表達式獲取菜名信息
food_pattern = re.compile(r'<span class="t">(.*)</span><span class="a">(.*)</span></a></div>')# 正則表達式獲得主料信息
fixing_pattern = re.compile(r'<div class="c_mtr_li"><span class="t1">(.*)</span><span class="a">(.*)</span></div>') # 正則表達式獲得輔料信息
fearture1_pattern = re.compile(r'<div class="cpargs cpargs2"><div class="i"></div>(.)</div>')# 正則表達式獲得特徵_1
fearture2_pattern = re.compile(r'<div class="cpargs cpargs3"><div class="i"></div>(.*)</div>')# 正則表達式獲得特徵_2

name = name_pattern.findall(resp.text) # 提取菜名信息
food = food_pattern.findall(resp.text)# 提取主料信息
fixing = fixing_pattern.findall(resp.text)#提取輔料信息
fearture1 = fearture1_pattern.findall(resp.text) #提取特徵_1
fearture2 = fearture2_pattern.findall(resp.text)#提取特徵_2

output.write(str(name))#將菜名寫入output文件,write函數不能寫int類型的參數,所以使用str()轉化
output.write('t')#進入下一個單元格
output.write(str(fearture1))#將特徵_1寫入output文件
output.write('t')#進入下一個單元格
output.write(str(fearture2))#將特徵_2寫入output文件
output.write('t')#進入下一個單元格

for i in range(len(food)):
for j in range(len(food[i])):
output.write(str(food[i][j])) #寫入主料
output.write('t')
if(len(food)<11):
output.write('t'*2*(11-len(food))) #每道菜的主料數目不同,該行代碼可使表格內容對齊

for i in range(len(fixing)):
for j in range(len(fixing[i])):
output.write(str(fixing[i][j])) #寫入輔料
output.write('t')

output.write('n') #換行
Step_3 信息導出

def spider():
output = open('E:programingpython蘇菜_2.xls','w',encoding='utf-8')#創建一個excel文件,編碼格式為utf-8
output.write('名稱t做法t特色t主料')#寫入標題欄
output.write('t'*22)#使內容對齊
output.write('輔料n')#寫入標題欄
for i in range(len(all_url)):
for j in range(len(all_url[i])):
url2=all_url[i][j]
response = requests.get(url2)#逐個訪問網頁,獲得數據
response.encoding = "utf-8" #設置接收編碼格式
get_info(response,output)#處理數據,提取信息
output.close()#關閉文件
主函數

time_start = time.time()#記錄程序開始時間
for i in range(1,2):#逐頁獲取菜譜網頁信息
get_all_url(i)
spider()#進行提取處理並導出
ration = 1000#提示音時長,1000毫秒 = 1秒
freq = 440 #提示音頻率
time_end=time.time()#記錄程序結束時間
print('totally cost',time_end-time_start)#列印程序運行時間
winsound.Beep(freq,ration*10) #響鈴提示程序結束
經實驗,爬取10000條代碼需要用時3453秒左右

.png
最後獲得的數據如下

.png
寫在後面

我是一個C語言上不了80的小白,全靠某度和某歌東拼西湊我的這個程序,在代碼風格與寫作等方面存在不可避免地會有一些錯誤和不足的地方,希望大家多多與我交流,多多批評指教我。

㈥ python爬蟲小白求幫助:爬取豆瓣網的內容 不知道哪裡出問題了 只能print一行

只獲取到一個movie_name 和 一個movies_score,然後遍歷這兩個值,循環一定是只走兩遍。不知道你這個是不是豆瓣top250 我看頁面元素好像不對了

㈦ 如何用python爬取豆瓣讀書的數據

這兩天爬了豆瓣讀書的十萬條左右的書目信息,用時將近一天,現在趁著這個空閑把代碼總結一下,還是菜鳥,都是用的最簡單最笨的方法,還請路過的大神不吝賜教。
第一步,先看一下我們需要的庫:

import requests #用來請求網頁
from bs4 import BeautifulSoup #解析網頁
import time #設置延時時間,防止爬取過於頻繁被封IP號
import re #正則表達式庫
import pymysql #由於爬取的數據太多,我們要把他存入MySQL資料庫中,這個庫用於連接資料庫
import random #這個庫里用到了產生隨機數的randint函數,和上面的time搭配,使爬取間隔時間隨機

這個是豆瓣的網址:x-sorttags-all
我們要從這里獲取所有分類的標簽鏈接,進一步去爬取裡面的信息,代碼先貼上來:

import requests
from bs4 import BeautifulSoup #導入庫

url="httom/tag/?icn=index-nav"
wb_data=requests.get(url) #請求網址
soup=BeautifulSoup(wb_data.text,"lxml") #解析網頁信息
tags=soup.select("#content > div > div.article > div > div > table > tbody > tr > td > a")
#根據CSS路徑查找標簽信息,CSS路徑獲取方法,右鍵-檢查- selector,tags返回的是一個列表
for tag in tags:
tag=tag.get_text() #將列表中的每一個標簽信息提取出來
helf="hom/tag/"
#觀察一下豆瓣的網址,基本都是這部分加上標簽信息,所以我們要組裝網址,用於爬取標簽詳情頁
url=helf+str(tag)
print(url) #網址組裝完畢,輸出

以上我們便爬取了所有標簽下的網址,我們將這個文件命名為channel,並在channel中創建一個channel字元串,放上我們所有爬取的網址信息,等下爬取詳情頁的時候直接從這里提取鏈接就好了,如下:

channel='''
tag/程序
'''

現在,我們開始第二個程序。


QQ圖片20160915233329.png


標簽頁下每一個圖片的信息基本都是這樣的,我們可以直接從這里提取到標題,作者,出版社,出版時間,價格,評價人數,以及評分等信息(有些外國作品還會有譯者信息),提取方法與提取標簽類似,也是根據CSS路徑提取。
我們先用一個網址來實驗爬取:

url="htt/tag/科技"
wb_data = requests.get(url)
soup = BeautifulSoup(wb_data.text.encode("utf-8"), "lxml")
tag=url.split("?")[0].split("/")[-1] #從鏈接裡面提取標簽信息,方便存儲
detils=soup.select("#subject_list > ul > li > div.info > div.pub") #抓取作者,出版社信息,稍後我們用spite()函數再將他們分離出來
scors=soup.select("#subject_list > ul > li > div.info > div.star.clearfix > span.rating_nums") #抓取評分信息
persons=soup.select("#subject_list > ul > li > div.info > div.star.clearfix > span.pl") #評價人數
titles=soup.select("#subject_list > ul > li > div.info > h2 > a") #書名
#以上抓取的都是我們需要的html語言標簽信息,我們還需要將他們一一分離出來
for detil,scor,person,title in zip(detils,scors,persons,titles):
#用一個zip()函數實現一次遍歷
#因為一些標簽中有譯者信息,一些標簽中沒有,為避免錯誤,所以我們要用一個try來把他們分開執行
try:
author=detil.get_text().split("/",4)[0].split()[0] #這是含有譯者信息的提取辦法,根據「/」 把標簽分為五部分,然後依次提取出來
yizhe= detil.get_text().split("/", 4)[1]
publish=detil.get_text().split("/", 4)[2]
time=detil.get_text().split("/", 4)[3].split()[0].split("-")[0] #時間我們只提取了出版年份
price=ceshi_priceone(detil) #因為價格的單位不統一,我們用一個函數把他們換算為「元」
scoe=scor.get_text() if True else "" #有些書目是沒有評分的,為避免錯誤,我們把沒有評分的信息設置為空
person=ceshi_person(person) #有些書目的評價人數顯示少於十人,爬取過程中會出現錯誤,用一個函數來處理
title=title.get_text().split()[0]
#當沒有譯者信息時,會顯示IndexError,我們分開處理
except IndexError:
try:
author=detil.get_text().split("/", 3)[0].split()[0]
yizhe="" #將detil信息劃分為4部分提取,譯者信息直接設置為空,其他與上面一樣
publish=detil.get_text().split("/", 3)[1]
time=detil.get_text().split("/", 3)[2].split()[0].split("-")[0]
price=ceshi_pricetwo(detil)
scoe=scor.get_text() if True else ""
person=ceshi_person(person)
title=title.get_text().split()[0]
except (IndexError,TypeError):
continue
#出現其他錯誤信息,忽略,繼續執行(有些書目信息下會沒有出版社或者出版年份,但是數量很少,不影響我們大規模爬取,所以直接忽略)
except TypeError:
continue

#提取評價人數的函數,如果評價人數少於十人,按十人處理
def ceshi_person(person):
try:
person = int(person.get_text().split()[0][1:len(person.get_text().split()[0]) - 4])
except ValueError:
person = int(10)
return person

#分情況提取價格的函數,用正則表達式找到含有特殊字元的信息,並換算為「元」
def ceshi_priceone(price):
price = detil.get_text().split("/", 4)[4].split()
if re.match("USD", price[0]):
price = float(price[1]) * 6
elif re.match("CNY", price[0]):
price = price[1]
elif re.match("A$", price[0]):
price = float(price[1:len(price)]) * 6
else:
price = price[0]
return price
def ceshi_pricetwo(price):
price = detil.get_text().split("/", 3)[3].split()
if re.match("USD", price[0]):
price = float(price[1]) * 6
elif re.match("CNY", price[0]):
price = price[1]
elif re.match("A$", price[0]):
price = float(price[1:len(price)]) * 6
else:
price = price[0]
return price

實驗成功後,我們就可以爬取數據並導入到資料庫中了,以下為全部源碼,特殊情況會用注釋一一說明。

import requests
from bs4 import BeautifulSoup
import time
import re
import pymysql
from channel import channel #這是我們第一個程序爬取的鏈接信息
import random

def ceshi_person(person):
try:
person = int(person.get_text().split()[0][1:len(person.get_text().split()[0]) - 4])
except ValueError:
person = int(10)
return person

def ceshi_priceone(price):
price = detil.get_text().split("/", 4)[4].split()
if re.match("USD", price[0]):
price = float(price[1]) * 6
elif re.match("CNY", price[0]):
price = price[1]
elif re.match("A$", price[0]):
price = float(price[1:len(price)]) * 6
else:
price = price[0]
return price

def ceshi_pricetwo(price):
price = detil.get_text().split("/", 3)[3].split()
if re.match("USD", price[0]):
price = float(price[1]) * 6
elif re.match("CNY", price[0]):
price = price[1]
elif re.match("A$", price[0]):
price = float(price[1:len(price)]) * 6
else:
price = price[0]
return price


#這是上面的那個測試函數,我們把它放在主函數中
def mains(url):
wb_data = requests.get(url)
soup = BeautifulSoup(wb_data.text.encode("utf-8"), "lxml")
tag=url.split("?")[0].split("/")[-1]
detils=soup.select("#subject_list > ul > li > div.info > div.pub")
scors=soup.select("#subject_list > ul > li > div.info > div.star.clearfix > span.rating_nums")
persons=soup.select("#subject_list > ul > li > div.info > div.star.clearfix > span.pl")
titles=soup.select("#subject_list > ul > li > div.info > h2 > a")
for detil,scor,person,title in zip(detils,scors,persons,titles):
l = [] #建一個列表,用於存放數據
try:
author=detil.get_text().split("/",4)[0].split()[0]
yizhe= detil.get_text().split("/", 4)[1]
publish=detil.get_text().split("/", 4)[2]
time=detil.get_text().split("/", 4)[3].split()[0].split("-")[0]
price=ceshi_priceone(detil)
scoe=scor.get_text() if True else ""
person=ceshi_person(person)
title=title.get_text().split()[0]
except IndexError:
try:
author=detil.get_text().split("/", 3)[0].split()[0]
yizhe=""
publish=detil.get_text().split("/", 3)[1]
time=detil.get_text().split("/", 3)[2].split()[0].split("-")[0]
price=ceshi_pricetwo(detil)
scoe=scor.get_text() if True else ""
person=ceshi_person(person)
title=title.get_text().split()[0]
except (IndexError,TypeError):
continue

except TypeError:
continue
l.append([title,scoe,author,price,time,publish,person,yizhe,tag])
#將爬取的數據依次填入列表中


sql="INSERT INTO allbooks values(%s,%s,%s,%s,%s,%s,%s,%s,%s)" #這是一條sql插入語句
cur.executemany(sql,l) #執行sql語句,並用executemary()函數批量插入資料庫中
conn.commit()

#主函數到此結束


# 將Python連接到MySQL中的python資料庫中
conn = pymysql.connect( user="root",password="123123",database="python",charset='utf8')
cur = conn.cursor()

cur.execute('DROP TABLE IF EXISTS allbooks') #如果資料庫中有allbooks的資料庫則刪除
sql = """CREATE TABLE allbooks(
title CHAR(255) NOT NULL,
scor CHAR(255),
author CHAR(255),
price CHAR(255),
time CHAR(255),
publish CHAR(255),
person CHAR(255),
yizhe CHAR(255),
tag CHAR(255)
)"""
cur.execute(sql) #執行sql語句,新建一個allbooks的資料庫


start = time.clock() #設置一個時鍾,這樣我們就能知道我們爬取了多長時間了
for urls in channel.split():
urlss=[urls+"?start={}&type=T".format(str(i)) for i in range(0,980,20)] #從channel中提取url信息,並組裝成每一頁的鏈接
for url in urlss:
mains(url) #執行主函數,開始爬取
print(url) #輸出要爬取的鏈接,這樣我們就能知道爬到哪了,發生錯誤也好處理
time.sleep(int(format(random.randint(0,9)))) #設置一個隨機數時間,每爬一個網頁可以隨機的停一段時間,防止IP被封
end = time.clock()
print('Time Usage:', end - start) #爬取結束,輸出爬取時間
count = cur.execute('select * from allbooks')
print('has %s record' % count) #輸出爬取的總數目條數

# 釋放數據連接
if cur:
cur.close()
if conn:
conn.close()

這樣,一個程序就算完成了,豆瓣的書目信息就一條條地寫進了我們的資料庫中,當然,在爬取的過程中,也遇到了很多問題,比如標題返回的信息拆分後中會有空格,寫入資料庫中會出現錯誤,所以只截取了標題的第一部分,因而導致資料庫中的一些書名不完整,過往的大神如果有什麼辦法,還請指教一二。
等待爬取的過程是漫長而又欣喜的,看著電腦上一條條信息被刷出來,成就感就不知不覺湧上心頭;然而如果你吃飯時它在爬,你上廁所時它在爬,你都已經爬了個山回來了它還在爬時,便會有點崩潰了,擔心電腦隨時都會壞掉(還是窮學生換不起啊啊啊啊~)
所以,還是要好好學學設置斷點,多線程,以及正則,路漫漫其修遠兮,吾將上下而求索~共勉~

㈧ 爬取網站時只能爬取前面3頁的數據應該怎麼辦

是因為網站反爬,或者加密了吧。
我之前用前嗅ForeSpider爬蟲採集旅行網站的時候也遇到過類似情況,當時是又另外編寫腳本才可以採集了。
要是有興趣,可以聯系一下前嗅客服,看看他們能不能採集。

㈨ 本來網頁幾萬的數據,但是爬蟲爬到5千行就自己停止了,為什麼

只要網頁上有顯示,肯定存在數據傳輸,先使用瀏覽器的開發者工具查看各請求信息,查找目標數據位置,盡可能多的關注多個特徵數據,定位數據位置,查看數據組成的規律。只要能夠在瀏覽器里找到信息,接下來就好辦多了。使用軟體可模擬瀏覽器發送請求過程,可添加特殊的請求頭信息,以達到獲取數據的目的。

閱讀全文

與豆瓣爬數據只能爬59條是為什麼相關的資料

熱點內容
成熟的男人和程序員應該選哪個 瀏覽:587
信息量是怎麼算 瀏覽:778
大數據什麼是績效考核 瀏覽:622
旅遊優惠信息哪裡看 瀏覽:600
高速倒車多久會收到信息 瀏覽:401
杭州聯通信息中心電話是多少 瀏覽:356
電力系統單機信息上傳是怎麼工作 瀏覽:68
東鳳最大的市場是哪個 瀏覽:97
杭州地鐵技術管理人員待遇怎麼樣 瀏覽:176
工廠合資技術分多少 瀏覽:986
羅馬交易所的幣是哪裡來的 瀏覽:343
為什麼交易貓發貨了沒反應 瀏覽:768
哪些渠道可以獲取到新店信息 瀏覽:280
系統技術升級中請稍後登錄什麼意思 瀏覽:334
產權轉讓怎麼交易 瀏覽:754
如何看懂產品的分析 瀏覽:958
如何把手薄數據做成表格 瀏覽:934
數據分析設計需要什麼軟體 瀏覽:80
小程序中wps編輯完成後如何保存 瀏覽:729
如何地推賣產品 瀏覽:228