iT邦幫忙

0

Python 爬蟲小問題

  • 分享至 

  • xImage

近日想製作用谷歌翻譯製作的小翻譯器
但卻發生了些問題https://ithelp.ithome.com.tw/upload/images/20190413/20116868DsTF5MqHPo.png)

圖片中我用谷歌的翻譯器 打yes 得到了'是'的結果
但是我用程式去爬我輸入yes時的網址的時候
當我把網站抓到的全部內容print出來
其中卻沒有任何'是'的結果
想請問是哪個環節出了問題了嗎

還有如果可以得到結果的話
要如何取得結果 不太清楚dev class等的關係
可以的話希望稍微說一下要怎麼取得特定內容

都只是自學 懇求指教> <

4/13 21:30 更新:
謝謝各位幫助 大致了解 應該就是要有辦法能取得動態的變數 離我還挺遙遠
那再問個小問題 從網路上看到的
r = requests.get('https://tw.yahoo.com/')
if r.status_code == requests.codes.ok:
soup = BeautifulSoup(r.text, 'html.parser')
stories = soup.find_all('a', class_='story-title')

以下是YAHOO的部分原始碼
https://ithelp.ithome.com.tw/upload/images/20190413/20116868GOiViWMt5e.png

不知道為什麼他的程式是去搜尋
find_all('a', class_='story-title')
而不是後面的class='Va-tt'
卻可以成功輸出需要的文字:慘被掏空200億 15年內大復活

看更多先前的討論...收起先前的討論...
ccutmis iT邦高手 2 級 ‧ 2019-04-13 04:29:09 檢舉
google translate網站有些複雜
加上你說了不太清楚div? class等關係,
那建議你別用BS4試試↓
https://pypi.org/project/googletrans/
(1)先安裝=> pip install googletrans
(2)建一個.py文件(例如gooTranslate.py),把下面的代碼複制貼上存檔

#coding=utf-8
from googletrans import Translator
translator = Translator()
queryString="一個好人"
answerString=translator.translate(queryString, dest='en').text
print(queryString+" : "+answerString)

執行python gooTranslate.py
》一個好人: A good man
froce iT邦大師 1 級 ‧ 2019-04-13 12:32:46 檢舉
這個根本不用看div啥的...
我瞄一眼就直接開開發者模式看XHR了。XD
ccutmis iT邦高手 2 級 ‧ 2019-04-13 13:02:57 檢舉
研究一下google translate XHR網址裡面有個tk值會隨你的查詢字串變動
用F12查XHR只改q=urlencode(arg)沒用
要能getTk(arg)才有辦法抓到內容 不然會是403喔
這對樓主目前的等級來說難度有點偏高 還是用牛人寫好的模組就好^^"
ccutmis iT邦高手 2 級 ‧ 2019-04-14 04:32:14 檢舉
stories =find_all(條件)
傳回所有符合條件的結果給stories(它是有點像陣列的結構)
如果你把它印出來 例如 print(stories)
會列出一長串同樣結構的東西
[<a href="..."><span...>...</span></a>,<a href="..."><span...>...</span></a>,<a href="..."><span...>...</span></a>,.........<a href="..."><span...>...</span></a>]

如果只印第一筆 例如 print(stories[0]) 則會只列出符合的第一筆
<a href="..."><span...>...</span></a>
我把實際符合的列一筆出來:
<a class="D-b Abu-C-b Fw-b Mstart-20 Mend-8 Mb-6 Ell Fz-m Cur-p story-title" data-ylk="rspns:nav;t1:a3;t2:td;t3:nav;sec:td-fea;elm:tl;elmt:ct;itc:0;cpos:2;pkgt:1;ccode:p_zh_hant_tw_lm_or1;aid:id-6232;g:6e8793c0-93a8-3087-8bf3-e3ab9d8fef94;cat:t1;subsec:t1;slk:等太久?駕駛竟怒鋸平交道欄杆;" href="https://tw.news.yahoo.com/%E7%AD%89%E5%A4%AA%E4%B9%85-%E7%94%B7%E6%8E%8F%E5%B7%A5%E5%85%B7%E7%A0%8D%E5%B9%B3%E4%BA%A4%E9%81%93%E6%AC%84%E6%9D%86-%E9%9C%B8%E6%B0%A3%E9%9B%A2%E5%8E%BB-121700644.html"><span class="Va-tt">等太久?駕駛竟怒鋸平交道欄杆</span></a>

這樣抓的條件是沒問題(假如你需要連結跟文字標題),有問題的是yahoo網頁源碼太多對我們無用的code,簡單用Re(規則運算式)把需要的留下不需要的篩掉,剩下的就是有用的,範例如下:

import requests,re
from bs4 import BeautifulSoup
r = requests.get('https://tw.yahoo.com/')
soup = BeautifulSoup(r.text, 'html.parser')
stories = soup.find_all('a', class_='story-title')
result = []
for i in stories:
四個空格result.append(re.sub("(<a )(.*?)(href=\")([^\"]+)(\")(.*?)(><span [^>]+>)([^<]+)(</span></a>)",r'\4____\8',str(i)))
for i in result:
四個空格print(i+'\n')

最後的資料會類似下面這樣:
'https://tw.news.yahoo.com/%E7%AD%89%E5%A4%AA%E4%B9%85-%E7%94%B7%E6%8E%8F%E5%B7%A5%E5%85%B7%E7%A0%8D%E5%B9%B3%E4%BA%A4%E9%81%93%E6%AC%84%E6%9D%86-%E9%9C%B8%E6%B0%A3%E9%9B%A2%E5%8E%BB-121700644.html'____'等太久?駕駛竟怒鋸平交道欄杆'

# "連結____標題" 的字串可以用下列方法取得資料
print("連結: "+ result[0][:(result[0].find("____"))])
print("標題: "+ result[0][(result[0].find("____")+4):])

這樣解釋不知會不會對你造成更大的迷惑,python網頁爬虫的前置知識是蠻雜的,建議你先把html+css基礎打穩,程式的部份慢慢來寫多了就會長進。
froce iT邦大師 1 級 ‧ 2019-04-15 12:01:35 檢舉
要練爬蟲,都建議先寫網頁,網頁你會寫,爬蟲你就會一半了。
剩下一半就是要跟其他網頁作者鬥智...Orz
ccutmis iT邦高手 2 級 ‧ 2019-04-15 15:12:17 檢舉
感覺樓主的html+css基礎不太穩
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

我要發表回答

立即登入回答