运行下面列出的示例代码时遇到问题: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')
当我通过终端外壳程序运行上述代码时(我正在运行Ubuntu 16.04),该程序未返回任何输出。我使用以下命令:
$ python3 BasicCrawler.py
我按Enter键,没有文本打印到终端上,就像我没有运行任何脚本一样。我可以在程序内部添加print()命令以验证程序是否正在运行,但是它似乎无法打印变量tet或tet2。
答案 0 :(得分: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”类的标签?
答案 1 :(得分:1)
您需要传递一个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)
答案 2 :(得分:0)
它没有打印任何内容,因为列表可能为空。 这意味着类名称为“ s-access-detail-page”的“ a”标记在您正在解析的html文档中不包含任何内容。
打印HTTP响应的输出,并尝试找出要在哪个块上进行迭代和获取数据的确切类。