我正试图出于教育目的从 Google翻译中抓取数据。
这里是code
from urllib.request import Request, urlopen
from bs4 import BeautifulSoup
#https://translate.google.com/#view=home&op=translate&sl=en&tl=en&text=hello
#tlid-transliteration-content transliteration-content full
class Phonetizer:
def __init__(self,sentence : str,language_ : str = 'en'):
self.words=sentence.split()
self.language=language_
def get_phoname(self):
for word in self.words:
print(word)
url="https://translate.google.com/#view=home&op=translate&sl="+self.language+"&tl="+self.language+"&text="+word
print(url)
req = Request(url, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0'})
webpage = urlopen(req).read()
f= open("debug.html","w+")
f.write(webpage.decode("utf-8"))
f.close()
#print(webpage)
bsoup = BeautifulSoup(webpage,'html.parser')
phonems = bsoup.findAll("div", {"class": "tlid-transliteration-content transliteration-content full"})
print(phonems)
#break
问题是当给我HTML时,没有tlid-transliteration-content transliteration-content full
类的CSS。
但是通过使用inspect,我发现音素位于此CSS类中,请按以下步骤操作:
我已经保存了html,here是,看一下,不存在tlid-transliteration-content transliteration-content full
,它不像其他Google翻译页面那样不完整。我听说Google阻止了爬虫,机器人,间谍。而且可以很容易地被他们的系统检测到,因此我添加了额外的标头,但仍然无法访问整个页面。
我该怎么做?要访问整个页面并从Google翻译页面中读取所有数据?
Want to contribute on this project?
我在下面尝试过此代码:
from requests_html import AsyncHTMLSession
asession = AsyncHTMLSession()
lang = "en"
word = "hello"
url="https://translate.google.com/#view=home&op=translate&sl="+lang+"&tl="+lang+"&text="+word
async def get_url():
r = await asession.get(url)
print(r)
return r
results = asession.run(get_url)
for result in results:
print(result.html.url)
print(result.html.find('#tlid-transliteration-content'))
print(result.html.find('#tlid-transliteration-content transliteration-content full'))
到目前为止,它什么也没给我。
答案 0 :(得分:2)
是的,发生这种情况是因为浏览器在页面加载时呈现了一些javascript生成的内容,但是在javascript(添加内容)进行了各种操作之后,您看到的是最终的DOM。要解决此问题,您需要使用selenium
,但是它有多个缺点,例如速度和内存问题。我认为,一种更现代,更好的方法是使用requests-html,它将取代bs4
和urllib
,并且具有文档中提到的render
方法。
这里是使用requests_html
的示例代码,请记住,您要打印的内容不是utf8
,因此您可能会遇到一些问题,例如在sublime等编辑器上打印它,指令
from requests_html import HTMLSession
session = HTMLSession()
r = session.get("https://translate.google.com/#view=home&op=translate&sl=en&tl=en&text=hello")
r.html.render()
css = ".source-input .tlid-transliteration-content"
print(r.html.find(css, first=True).text)
# output: heˈlō,həˈlō
答案 1 :(得分:1)
首先,我建议您使用Google Translate API而不是抓取Google页面。该API轻松了一百倍,而且没有麻烦,并且是合法且传统的方式。
但是,如果您要解决此问题,请使用以下解决方案。
您不在此处处理Bot检测。 Google的漫游器检测功能非常强大,它只会打开google re-captcha
页面,甚至不会显示您想要的网页。
这里的问题是翻译的结果不会使用您使用的URL返回。此URL仅显示基本的翻译器页面,结果稍后由javascript
提取,并在页面加载后显示在页面上。 python-requests
未处理javascript,这就是为什么您正在访问的web-page
中甚至都不存在该类的原因。
解决方案是跟踪数据包并检测URL
正在使用哪个javascript
来获取结果。幸运的是,我已经找到了为此目的所需的URL
。
如果您请求https://translate.google.com/translate_a/single?client=webapp&sl=en&tl=fr&hl=en&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&dt=gt&source=bh&ssel=0&tsel=0&kc=1&tk=327718.241137&q=goodmorning
,则将以JSON形式获得翻译器的响应。您可以解析JSON以获得所需的结果。
在这里,您可以在此处面对Bot检测,该检测可以立即引发HTTP 403错误。
您还可以使用selenium
处理javascript
并获得结果。更改代码后,可以使用selenium
from selenium import webdriver
from urllib.request import Request, urlopen
from bs4 import BeautifulSoup
#https://translate.google.com/#view=home&op=translate&sl=en&tl=en&text=hello
#tlid-transliteration-content transliteration-content full
class Phonetizer:
def __init__(self,sentence : str,language_ : str = 'en'):
self.words=sentence.split()
self.language=language_
def get_phoname(self):
for word in self.words:
print(word)
url="https://translate.google.com/#view=home&op=translate&sl="+self.language+"&tl="+self.language+"&text="+word
print(url)
#req = Request(url, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0'})
#webpage = urlopen(req).read()
driver = webdriver.Chrome()
driver.get(url)
webpage = driver.page_source
driver.close()
f= open("debug.html","w+")
f.write(webpage.decode("utf-8"))
f.close()
#print(webpage)
bsoup = BeautifulSoup(webpage,'html.parser')
phonems = bsoup.findAll("div", {"class": "tlid-transliteration-content transliteration-content full"})
print(phonems)
#break
答案 2 :(得分:0)
您应该在此页面上添加Javascript
支持,因为您要查找的内容是<script>
标签内的“隐藏”标签,而urllib
标签不会呈现。
我建议使用Selenium
或其他等效框架。
在这里看看:Web-scraping JavaScript page with Python