Tra*_*ish 2 python parsing flickr beautifulsoup
我现在正在读一本关于 Python 的书。有一个家庭作业的小项目:“编写一个程序,访问 Flickr 或 Imgur 等照片共享网站,搜索一类照片,然后下载所有生成的图像。” 建议只使用 webbrowser、requests 和 bs4 库。
我不能为 Flickr 做这件事。我发现解析器不能进入元素内部(div class="interaction-view")。在 Chrome 中使用“Inspect element”我可以看到里面有一些“div”元素和“a”元素。但是,当我使用 bs4 库时,它看不到它。
我的代码是这样的:
#!/usr/bin/env python3
# To download photos from Flickr
import requests, bs4
search_name = "spam"
website_name = requests.get('https://www.flickr.com/search/?text='
+ search_name)
website_name.raise_for_status()
parse_obj = bs4.BeautifulSoup(website_name.text, "html.parser")
elements = parse_obj.select('body #content main .main.search-photos-results \
.view.photo-list-view.requiredToShowOnServer \
.view.photo-list-photo-view.requiredToShowOnServer.awake \
.interaction-view')
print(elements)
Run Code Online (Sandbox Code Playgroud)
它只打印:
[<div class="interaction-view"></div>, <div class="interaction-view"></div>...]
Run Code Online (Sandbox Code Playgroud)
没有任何嵌套元素,我不明白为什么...谢谢!
问题是<div class="interaction-view"></div>
flickr 上的内容只能通过 javascript 加载。您可以检查是否查看页面源代码,您会发现:<div class="interaction-view"></div>
div 标签中没有内容。
您需要以某种方式执行 javascript。由于beautifulsoup 不提供此功能,因此一种解决方案是为此使用硒。pip install selenium
并geckodriver
为 Firefox安装(在 OSX 上:)brew install geckodriver
。然后更改您的代码以使用 selenium 加载页面:
#!/usr/bin/env python3
import requests, bs4
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
search_name = "spam"
url = 'https://www.flickr.com/search/?text=%s' % search_name
browser = webdriver.Firefox()
browser.get(url)
delay = 3
WebDriverWait(browser, delay).until(EC.presence_of_element_located(browser.find_element_by_id('...')))
soup = bs4.BeautifulSoup(browser.page_source, "html.parser")
elements = soup.select('body #content main .main.search-photos-results \
.view.photo-list-view.requiredToShowOnServer \
.view.photo-list-photo-view.requiredToShowOnServer.awake \
.interaction-view')
print(elements)
Run Code Online (Sandbox Code Playgroud)
该WebDriverWait
部分是必需的,因此 selenium 等待解析,直到加载某个元素。您需要更改...
为您知道会出现的 ID。请参阅此答案以检查如何使用类来完成。