我正在从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&max_price=700&postal=19132&query=graphics%20card&search_distance=400" class="button next" title="next page">next > </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()
我期望的是从一个页面获取每个列表,然后转到下一个页面并获取其列表,依此类推,直到我获得最后一页上的所有列表,并且没有更多的页面