Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pyhton请求未获取所有数据_Python_Beautifulsoup_Python Requests - Fatal编程技术网

Python pyhton请求未获取所有数据

Python pyhton请求未获取所有数据,python,beautifulsoup,python-requests,Python,Beautifulsoup,Python Requests,为了教育目的,我正试图从谷歌翻译中搜集数据 这是你的电话号码 问题是当给我html时,没有tlid音译内容,也没有完整的css类 但是使用inspect,我发现,音素在这个css类中,这里拍一张快照: 我已经保存了html,它是,看一看,没有tlid的音译内容完整的音译内容是存在的,它不像其他谷歌翻译页面,它是不完整的。我听说谷歌阻止了爬虫,机器人,spyder。而且它很容易被他们的系统检测到,所以我添加了额外的标题,但仍然无法访问整个页面 我怎样才能做到?访问整个页面并从谷歌翻译页面读取所有

为了教育目的,我正试图从谷歌翻译中搜集数据

这是你的电话号码

问题是当给我html时,没有tlid音译内容,也没有完整的css类

但是使用inspect,我发现,音素在这个css类中,这里拍一张快照:

我已经保存了html,它是,看一看,没有tlid的音译内容完整的音译内容是存在的,它不像其他谷歌翻译页面,它是不完整的。我听说谷歌阻止了爬虫,机器人,spyder。而且它很容易被他们的系统检测到,所以我添加了额外的标题,但仍然无法访问整个页面

我怎样才能做到?访问整个页面并从谷歌翻译页面读取所有数据

我已在下面尝试了此代码:

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支持来删除此页面,因为您要查找的内容隐藏在标记中,而urllib不会呈现。 我建议使用Selenium或其他等效框架。
请看这里:

您应该使用Javascript支持删除此页面,因为您要查找的内容隐藏在标记中,而urllib不会呈现该标记。 我建议使用Selenium或其他等效框架。
看看这里:

是的,发生这种情况是因为浏览器在页面加载时呈现一些javascript生成的内容,但在javascript添加内容进行各种操作之后,您看到的是最终的DOM。要解决这个问题,您需要使用selenium,但它有很多缺点,比如速度和内存问题。在我看来,一种更现代、更好的方法是使用它来替换bs4和urllib,并且它有一个文档中提到的呈现方法

这是一个使用requests_html的示例代码,请记住,您试图打印的不是utf8,因此在某些编辑器(如sublime)上打印它时可能会遇到一些问题,使用cmd时运行良好

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ō

是的,这是因为一些javascript生成的内容在页面加载时由浏览器呈现,但在javascript添加内容进行各种操作之后,您看到的是最终的DOM。要解决这个问题,您需要使用selenium,但它有很多缺点,比如速度和内存问题。在我看来,一种更现代、更好的方法是使用它来替换bs4和urllib,并且它有一个文档中提到的呈现方法

这是一个使用requests_html的示例代码,请记住,您试图打印的不是utf8,因此在某些编辑器(如sublime)上打印它时可能会遇到一些问题,使用cmd时运行良好

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ō

首先,我建议您使用谷歌翻译API,而不是刮谷歌页面。API是一种容易一百倍、无麻烦、合法且传统的方法

但是,如果您想解决这个问题,下面是解决方案。 你不是在处理机器人检测。谷歌的机器人检测功能非常强大,它只会打开谷歌重新验证码页面,甚至不会显示你想要的网页。 这里的问题是,翻译结果不会使用您使用的URL返回。这个URL只显示基本的翻译页面,结果稍后由javascript获取,并在页面加载后显示在页面上。python请求不会处理javascript,这就是为什么在您访问的网页中甚至不存在该类的原因

解决方案是跟踪数据包并检测javascript使用哪个URL获取结果。幸运的是,我已经找到了用于此目的的所需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,您将得到translator的JSON响应。您可以解析JSON以获得所需的结果。 在这里,您可以面对机器人检测,它可以直接抛出HTTP403错误

您还可以使用selenium处理javascript并给出结果。代码中的以下更改可以使用selenium进行修复


首先,我建议您使用谷歌翻译API,而不是刮谷歌页面。API是一种容易一百倍、无麻烦、合法且传统的方法

但是,如果您想解决这个问题,下面是解决方案。 你不是在处理机器人检测。谷歌的机器人检测功能非常强大,它只会打开谷歌重新验证码页面,甚至不会显示你想要的网页。 这里的问题是,翻译结果不会使用您使用的URL返回。这个URL只显示基本的翻译页面,结果稍后由javascript获取,并在页面加载后显示在页面上。python请求不处理javascript 这就是为什么这个类在你访问的网页中根本不存在的原因

解决方案是跟踪数据包并检测javascript使用哪个URL获取结果。幸运的是,我已经找到了用于此目的的所需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,您将得到translator的JSON响应。您可以解析JSON以获得所需的结果。 在这里,您可以面对机器人检测,它可以直接抛出HTTP403错误

您还可以使用selenium处理javascript并给出结果。代码中的以下更改可以使用selenium进行修复


我已经尝试过你的方法,使用requests\u html,但是当我尝试选择CSS元素时,它什么都没有给我,你能帮我吗?@MaifeeUlAsad什么都没有给我,确切地说?你在说什么CSS元素?tlid音译内容音译内容完整的CSS元素,这个类的div。。。它给我[],数组长度为0@AlexanderCécile@MaifeeUlAsad你能试试CSS选择器方法吗,看看是否有效?在class_uu参数中而不是在attrs下编写类可以完成这项工作。我已经尝试过你的方法,使用requests_uhtml,但当我尝试选择CSS元素时,它不会给我任何帮助,你能在这里帮助我吗?@MaifeeUlAsad什么没有给我任何意义,确切地说?你在说什么CSS元素?tlid音译内容音译内容完整的CSS元素,这个类的div。。。它给我[],数组长度为0@AlexanderCécile@MaifeeUlAsad你能试试CSS选择器方法吗,看看是否有效?在class_uu参数中而不是在attrs下编写类可能可以完成这项工作。我曾尝试使用requests_html,但当我尝试选择CSS元素时,它会给我空列表或数组,你能在这里帮助我吗?@MaifeeUlAsad给你,刚刚添加了一个运行fine的示例代码我尝试使用requests_html,但是,当我试图选择CSS元素时,它会给我一个空列表或数组,你能在这里帮助我吗?@MaifeeUlAsad在这里,刚刚添加了一个运行良好的示例代码
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