首页 文章

Python3中的简单Web爬虫不生成输出 . 这是怎么回事?

提问于
浏览
1

我在运行此处列出的示例代码时遇到问题:https://dev.to/pranay749254/build-a-simple-python-web-crawler .

这是我试图运行的代码:

import requests
from bs4 import BeautifulSoup
def web(page,WebUrl):
    if(page>0):
        url = WebUrl
        code = requests.get(url)
        plain = code.text
        s = BeautifulSoup(plain, "html.parser")
        for link in s.findAll('a', {'class':'s-access-detail-page'}):
            tet = link.get('title')
            print(tet)
            tet_2 = link.get('href')
            print(tet_2)
web(1,'https://www.amazon.com/s/ref=nb_sb_noss_2?url=search-alias%3Daps&field-keywords=Stomp+box&rh=i%3Aaps%2Ck%3AStomp+box')

当我通过终端shell(我正在运行Ubuntu 16.04)运行上面的代码时,程序不返回任何输出 . 我使用以下命令:

$ python3 BasicCrawler.py

我按下回车键,终端上没有打印文字,就像我没有运行任何脚本一样 . 我能够在程序中添加print()命令来验证它是否正在运行,但它似乎没有打印变量tet或tet2 .

3 回答

  • 1

    它不打印任何东西,因为列表可能是空的 . 这意味着类名“s-access-detail-page”的“a”标记在您正在解析的html doc中不包含任何内容 .

    打印HTTP响应的输出,并尝试找出要迭代哪个块并获取数据的确切类 .

  • 0

    您需要传递User-Agent标头 . 此外,对于我使用的方法,您不能在CSS选择器中使用复合类名,因此空格必须替换为“ . ” . 我也完成了相关链接 .

    在您的代码中,您需要以下内容:

    code = requests.get(url,  headers = {'User-agent': 'Mozilla/5.0'})
    

    我的版本:

    import requests
    from bs4 import BeautifulSoup
    
    re = requests.get('https://www.amazon.com/s/ref=nb_sb_noss_2?url=search-alias%3Daps&field-keywords=Stomp+box&rh=i%3Aaps%2Ck%3AStomp+box', headers = {'User-agent': 'Mozilla/5.0'} )
    print(re.status_code)
    soup = BeautifulSoup(re.content, 'lxml')
    base = 'https://www.amazon.com'
    links = [(link['title'] ,link['href']) for link in soup.select("a.a-link-normal.s-access-detail-page.s-color-twister-title-link.a-text-normal" )]
    links = [(link[0], base + link[1])  if 'slredirect' in link[1] else link for link in links]
    print(links)
    
  • 1

    我进入了shell_plus并用几个打印件运行你的代码:

    In [9]: import requests
       ...: from bs4 import BeautifulSoup
       ...: def web(page,WebUrl):
       ...:     if(page>0):
       ...:         print('page is greater than zero')
       ...:         url = WebUrl
       ...:         code = requests.get(url)
       ...:         plain = code.text
       ...:         s = BeautifulSoup(plain, "html.parser")
       ...:         # hmm, no results
       ...:         #for link in s.findAll('a', {'class':'s-access-detail-page'}):
       ...:         # lets try more open query path to see if we get hits
       ...:         for link in s.findAll('a'):
       ...:             print('link: ', link)
       ...:             tet = link.get('title')
       ...:             print(tet)
       ...:             tet_2 = link.get('href')
       ...:             print(tet_2)
       ...: web(1,'https://www.amazon.com/s/ref=nb_sb_noss_2?url=search-alias%3Daps&
       ...: field-keywords=Stomp+box&rh=i%3Aaps%2Ck%3AStomp+box')
    

    我发现原始代码没有结果,所以没有输出 . 然后,我将输入更改为findAll只是找到一个标签并得到结果,所以我猜测目标页面此时实际上没有任何带有“s-access-detail-page”类的标签?

相关问题