我正试着从Google translate中搜集数据,用于教育目的。你知道吗
这是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时,没有css的tlid-transliteration-content transliteration-content full
类。你知道吗
但是使用inspect,我发现,音素在这个css类中,这里简单介绍一下:
我已经保存了html,而且here它是,看一看,没有tlid-transliteration-content transliteration-content full
是存在的,它不像其他谷歌翻译页面,它是不完整的。我听过谷歌阻止爬虫,机器人,spyder。而且很容易被他们的系统检测到,所以我添加了额外的标题,但仍然无法访问整个页面。你知道吗
我该怎么做?访问整个页面并从谷歌翻译页面读取所有数据?
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'))
到现在为止,我什么也没得到
是的,这是因为一些javascript生成的内容是在页面加载时由浏览器呈现的,但是在javascript进行各种操作(添加内容)之后,您看到的是最终的DOM。要解决这个问题,您需要使用
selenium
,但是它有很多缺点,比如速度和内存问题。在我看来,一种更现代、更好的方法是使用requests-html,它将同时替换bs4
和urllib
,并且它有文档中提到的render
方法。你知道吗下面是一个使用
requests_html
的示例代码,请记住您试图打印的不是utf8
,因此在某些编辑器(如sublime)上打印时可能会遇到一些问题,使用cmd运行良好。你知道吗首先,我建议您使用googletranslateapi,而不是刮Google页面。API是一个百倍容易,无麻烦,合法和传统的方式来做这件事。你知道吗
但是,如果您想解决这个问题,这里有一个解决方案。 你不是在处理机器人检测。谷歌的机器人检测功能非常强大,它只会打开Google
re-captcha
页面,甚至不会显示你想要的网页。 这里的问题是,翻译结果不会使用您使用的URL返回。这个URL只显示基本的翻译页面,结果稍后由javascript
获取,并在页面加载后显示在页面上。javascript不被python-requests
处理,这就是为什么类甚至不存在于您正在访问的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检测,它可以直接抛出http403错误。你知道吗您还可以使用
selenium
来处理javascript
并给出结果。代码中的以下更改可以使用selenium
修复它您应该用
Javascript
支持来标记此页,因为您要在<script>
标记中“隐藏”的内容urllib
不会呈现。我建议使用
Selenium
或其他等效框架。看看这里:Web-scraping JavaScript page with Python
相关问题 更多 >
编程相关推荐