无法通过在某些搜索框中使用井号产生结果

时间:2019-07-13 08:33:09

标签: python python-3.x selenium selenium-webdriver web-scraping

我已经用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语句?

  • 如何生成该标签搜索的结果?

3 个答案:

答案 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语句。但是,如果您确实坚持使用显式的return语句,那么在函数末尾使用简单的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)