有没有办法在python中使用Selenium Webdriver循环浏览页面?

时间:2019-09-03 00:38:31

标签: python selenium selenium-webdriver

我正在从Craigslist收集列表信息,并且能够在第一页上获取所有列表,另存为.csv文件,然后导出到我的MongoDB集合中。我想知道在首页收集完所有列表后如何转到网站的下一页,然后获取所有页面列表,依此类推,直到脚本获取最后一页上的所有列表,然后没有更多的页面了。

我注意到默认情况下,Craigslist在第一页上显示119个列表,然后在第二页上显示121-> 240列表,依此类推。网站上的格式为“ 1-120 /#num of total listings”。 URL中还有一个元素“ s =“,该元素在您每次单击“下一页”并转到新页面时都会更新。例如,在第一页上,“ s =“不在URL中,因此我将“ s = 0”放在其位置,并且该页面正常加载。转到下一页和“ s = 120”,下一页“ s = 240”,依此类推。

我正在考虑在搜索(n)之后获取列表总数,并将MAX_PAGES = 119 / n(向上取整)。然后在init主程序中,在获取URL的函数周围放置一个for循环“ for I in range(MAX_PAGES)”,并确保所有清单均已收集并写入.csv文件。我只是不知道如何从craigslist页面中获得#num个列表。

更新 我意识到我的建议只会一次又一次地从第一页获取内容。我需要一个硒​​工具才能物理地转到下一页,直到next_page!= nul为止为idk。

在chrome浏览时检查列表中的下一页按钮内容

<a href="/search/sss?s=120&amp;max_price=700&amp;postal=19132&amp;query=graphics%20card&amp;search_distance=400" class="button next" title="next page">next &gt; </a>

构造函数

def __init__(self, location, postal_code, max_price, query, radius,s):
    self.location = location
    self.postal_code = postal_code
    self.max_price = max_price
    self.query = query
    self.radius = radius
    self.s = s

    # MAX_PAGE_NUM =

    self.url = f"https://{location}.craigslist.org/search/sss?s={s}&max_price={max_price}&postal={postal_code}&query={query}&20card&search_distance={radius}"

    self.driver = webdriver.Chrome('/usr/bin/chromedriver')
    self.delay = 5

获取网址

def load_craigslist_url(self):
    self.driver.get(self.url)
    try:
        wait = WebDriverWait(self.driver, self.delay)
        wait.until(EC.presence_of_element_located((By.ID, "searchform")))
        print("Page is ready")
    except TimeoutException:
        print("Loading took too long")

提取网址中的列表

 def extract_post_urls(self):
        url_list = []
        html_page = urllib.request.urlopen(self.url)
        soup = BeautifulSoup(html_page)
        for link in soup.findAll("a", {"class": "result-title hdrlnk"}):
            print(link["href"])
            url_list.append(link["href"])
        return url_list

主要

if __name__ == "__main__":
    filepath = '/home/diego/git_workspace/PyScrape/data.csv'  # Filepath of written csv file
    location = "philadelphia"  # Location Craigslist searches
    postal_code = "19132"  # Postal code Craigslist uses as a base for 'MILES FROM ZIP'
    max_price = "700"  # Max price Craigslist limits the items too
    query = "graphics+card"  # Type of item you are looking for
    radius = "400"  # Radius from postal code Craigslist limits the search to
    s = 0

    scraper = CraigslistScraper(location, postal_code, max_price, query, radius, s)
    scraper.load_craigslist_url()
    titles, prices, dates = scraper.extract_post_information()

我期望的是从一页获取所有列表,然后转到下一页并获取其列表,依此类推,直到我在最后一页获得所有列表,并且再也没有页面了

0 个答案:

没有答案