社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

有没有办法在python中使用selenium webdriver循环页面?

Diego Delgado • 4 年前 • 425 次点击  

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

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

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

更新 意识到我的建议只会一次又一次地从第一页得到内容。我需要一个selenium工具在物理上转到下一页,直到idk,而下一页!=无。

Craigslist在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

获取url

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")

提取url中的列表

 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()

我期望的是从一个页面获取每个列表,然后转到下一个页面并获取其列表,依此类推,直到我获得最后一页上的所有列表,并且没有更多的页面

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/50901
 
425 次点击