我正在从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&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
获取网址
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()
我期望的是从一页获取所有列表,然后转到下一页并获取其列表,依此类推,直到我在最后一页获得所有列表,并且再也没有页面了