我已经用Python用Selenium编写了一个脚本来登录Instagram,然后搜索一些标签,如#NewYorkbarbers
中所示,并获得该标签的链接。我的脚本可以成功登录,如果出现Not Now
框,请单击Turn on Notifications
按钮,然后将该井号标签放在搜索框中,但是我无法让我的脚本启动搜索以产生结果针对该标签。
到目前为止,我已经尝试过:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
class InstagramScraper:
login_url = 'https://www.instagram.com/accounts/login/?source=auth_switcher'
def __init__(self,username,password):
self.driver = webdriver.Chrome()
self.wait = WebDriverWait(self.driver,10)
self.login(username,password)
def login(self,username,password):
self.driver.get(self.login_url)
self.wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR,'input[name="username"]'))).send_keys(username)
self.wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR,'input[name="password"]'))).send_keys(password)
self.wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR,'button[type="submit"]'))).click()
try:
self.wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR,'button.HoLwm'))).click()
except Exception:pass
def use_hashtag(self):
self.wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR,'input[placeholder="Search"]'))).send_keys("#NewYorkbarbers",Keys.ENTER)
if __name__ == '__main__':
scraper = InstagramScraper('username','password')
scraper.use_hashtag()
我如何在return
方法中使用login()
,因为任何理想的方法都应该在其中包含return语句?
如何生成该标签搜索的结果?
答案 0 :(得分:1)
具有return语句的一般想法是返回。
当您返回一条语句时,它会返回到被调用的地方。
当您写return value
时,表示返回并取该值。
如果未给出return语句,则表示return None
答案 1 :(得分:0)
您正在使用Enter键来启动搜索,但是如果您在浏览器中打开Instagram,您将知道即使手动操作也无法实现。
Instagram不会仅按Enter的一次按键就启动搜索,当您第一次按Enter时,它将专注于第一个搜索建议,这需要花费一些时间来加载(这并不能保证是您输入的#tag,因此最好也检查文本并单击特定的#tag),当您再次按Enter键时,它将启动对当前聚焦的主题标签的搜索。
即使这还不够,实际上,您需要等待搜索框的建议下拉列表打开,然后从建议的项目中找到所需的#tag,然后按Enter。
基本上,该脚本太快了,无法给时间来显示搜索建议(即使是手动操作,您也可以按Enter键两次快,然后下拉菜单才会出现,并且不会启动搜索。)并且它也需要两次按Enter键,首先将重点放在第一个建议上,其次将启动搜索。
答案 2 :(得分:0)
在python中,并非所有函数都需要返回某些东西,甚至也不约定所有函数都以return语句结尾(不同于其他语言,如C)。实际上,根据this question,return
将是最佳选择。
对于其他问题,加载搜索建议后会出现一个新的div,因此您必须等待该div,然后发送两次enter键。
这里是新的use_hashtag
方法:(很抱歉使用xpath而不是CSS选择器,但是我对CSS和chrome开发人员工具不满意,它们总是依赖于类名):
def use_hashtag(self):
search_input = self.wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR,'input[placeholder="Search"]')))
search_input.send_keys("#NewYorkbarbers")
self.wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="react-root"]/section/nav/div[2]/div/div/div[2]/div[2]/div[2]')))
search_input.send_keys(Keys.ENTER, Keys.ENTER)