我用Python编写了一个脚本,使用Selenium登录到Instagram,然后搜索一些hashtag,比如在#NewYorkbarbers
中,然后获取这个hashtag的链接。我的脚本可以成功登录,如果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()
,因为任何理想的方法都应该有返回语句?发布于 2019-07-18 02:17:58
返回语句的一般概念是返回。当您在语句中返回时,它会从调用它的位置返回。当你写return value
时,它的意思是返回并接受这个值。如果没有给出返回语句,就意味着return None
发布于 2019-07-18 02:30:25
您正在使用Enter键启动搜索,但是如果您在浏览器中打开Instagram,您就会知道这是不可能的。
Instagram不只是在enter的单一键上启动搜索,当您第一次按enter键时,它将集中在第一个搜索建议上,这需要一些时间来加载(这并不保证是您键入的#标记,所以最好也检查文本和单击特定的#标记),当您第二次按enter键时,它将开始搜索当前聚焦的散列表。
甚至这还不够,实际上,您需要等待搜索框的建议下拉打开,然后从建议项中找到所需的#标记,然后按enter键。
基本上,这个脚本太快了,无法给搜索建议出现的时间(即使手动地点击Enter也比下拉显示快两倍,搜索也不会启动)。而且它还需要两次回车,第一次集中第一次建议,第二次开始搜索。
发布于 2019-07-21 16:13:31
在python中,并不是所有函数都需要返回某些内容,甚至不是以返回语句结束所有函数的约定(与其他语言(如C)不同)。事实上,根据this question的说法,最好不要有返回语句。但是,如果您确实坚持要有一个显式返回语句,那么函数末尾的简单return
将是最好的选择。
至于您的另一个问题,在加载搜索建议时会出现一个新的div,因此您必须等待该div,然后发送两次enter。
下面是新的use_hashtag
方法:(不好意思使用xpath而不是css选择器,但我不熟悉css,铬开发工具一直依赖于类名):
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)
https://stackoverflow.com/questions/57017486
复制相似问题