我正在尝试解析网站中的表格,但在页面更改时无法保存表格。此外,换页器不响应循环。我有这个代码:
import time
import requests
import pandas
import pandas as pd
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import json
driver = webdriver.Chrome('C:\DRIVERS\chromedriver.exe')
driver.get('https://www.remax.pt/comprar?searchQueryState={%22regionName%22:%22%22,%22businessType%22:1,%22listingClass%22:1,%22page%22:1,%22sort%22:{%22fieldToSort%22:%22ContractDate%22,%22order%22:1},%22mapIsOpen%22:false}')
driver.maximize_window()
driver.implicitly_wait(5)
wait = WebDriverWait(driver, 10)
cookies = driver.find_element_by_id('rcc-decline-button')
cookies.click()
element_list = []
for j in range (1,2569):
try:
for i in range(1,40,2):
link = driver.find_element_by_xpath("(//div[@class='listing-search-searchdetails-component'])[{0}]".format(i))
link.click()
try:
detalhes = driver.find_element_by_id('details')
preço = driver.find_element_by_id('listing-price')
tipo = driver.find_element_by_id('listing-title')
freguesia = driver.find_element_by_xpath('//h5[@class="listing-address"]')
imoveis = [detalhes.text, preço.text, tipo.text, freguesia.text]
element_list.append(imoveis)
finally:
driver.back()
finally:
wait.until(EC.element_to_be_clickable((By.XPATH,"//a[@class='page-link'][.//span[.='Next']]"))).click()
请注意,内循环在第一页中起作用,但在第二页中不起作用。外循环甚至没有开始(即它只更改页面一次)
答案 0 :(得分:1)
与在此处使用 Selenium 相比,通过 api 获取数据会容易得多。您还可以调整每个请求返回的大小,但我注意到在某些时候它不会返回任何内容。有了它,它看起来限制了您可以返回的数量是 10,000 个列表(即使在网站上,它也不会返回超过第 500 页的任何列表:
*注意,如果您更改 size=10000
,您可以在 1 个请求中获得全部。
import requests
import math
import pandas as pd
url = 'https://www.remax.pt/Api/Listing/MultiMatchSearch'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36'}
payload = {"filters":
[{"field":"BusinessTypeID","value":"1","type":0},
{"field":"ListingClassID","value":"1","type":0}],
"sort":{"fieldToSort":"ContractDate","order":1}}
size=10000
query_payload = {
'page':0,
'searchValue':'',
'size':size}
jsonData = requests.post(url, params=query_payload,json=payload).json()
total_pages = math.ceil(jsonData['total']/ size)
element_list = []
for page in range(0,total_pages+1):
if page != 0:
query_payload.update({'page':page})
jsonData = requests.post(url, params=query_payload,json=payload, headers=headers).json()
if len(jsonData['results']) == 0:
break
element_list += jsonData['results']
print('Collected: Page %s: %s listings' %(page+1, len(jsonData['results'])))
listing_df = pd.DataFrame(element_list)
rows = []
listing_ids = list(listing_df['listingTitle'])
for idx, listing_id in enumerate(listing_ids):
listing_url = 'https://s.maxwork.pt/site/static/9/listings/details/%s.html' %listing_id
response = requests.get(listing_url, headers=headers)
temp_details = pd.read_html(response.text)[0]
alpha = temp_details.iloc[:,[0,1]]
beta = temp_details.iloc[:,[2,3]]
beta.columns = alpha.columns
details = pd.concat([alpha,beta])
details['listingTitle'] = listing_id
details = details.pivot(index='listingTitle',columns=0,values=1).reset_index(drop=False)
rows += details.to_dict(orient='records')
print('%s of %s' %(idx+1,len(listing_ids)))
listing_desc_df = pd.DataFrame(rows)
df = listing_df.merge(listing_desc_df, how='left', on=['listingTitle'])
输出:
print(df.head(50).to_string())
listingTitle autocompleteListingTitle isSold coordinates longitude latitude listingPrice listingPriceText listingTypeID isSpecial regionName1 region2ID regionName2 region3ID regionName3 Ano de construção Eficiência energética Elevador Estacionamento Piso Quartos Total do lote m2 WCs Área Bruta m2 Área Útil m2
0 120241178-64 120241178-64 False {'latitude': 41.5563011169434, 'longitude': -8.42594718933105} -8.425947 41.556301 120000.0 120 000 € 1 False Braga 406 Braga 137539 São Vicente 1996 D Sim 1 Lug. 1º Andar 1 -- 1 64 60
1 120251173-297 120251173-297 False {'latitude': 39.7427291870117, 'longitude': -8.81297206878662} -8.812972 39.742729 77000.0 77 000 € 1 False Leiria 523 Leiria 7881422 Marrazes e Barosa 1983 C Não Não 2º Andar 3 102 2 90 90
2 120511052-2321 120511052-2321 False {'latitude': 38.7048034667969, 'longitude': -9.21482944488525} -9.214829 38.704803 1500000.0 1 500 000 € 11 False Lisboa 537 Lisboa 7881111 Belém 1988 D Não 2 Lug. -- 10 -- 6 300 260
3 120521374-517 120521374-517 False {'latitude': 38.7670211791992, 'longitude': -9.23021984100342} -9.230220 38.767021 56000.0 56 000 € 1 False Lisboa 532 Amadora 7881439 Mina de Água 1981 C Sim Não C/V 0 -- 1 30 26
4 120531261-11 120531261-11 False None NaN NaN 110000.0 110 000 € 1 False Lisboa 542 Sintra 7881760 Cacém e São Marcos 1995 C Sim Não 3º Andar 1 -- 1 65 54
5 120611192-931 120611192-931 False {'latitude': 38.8063354492188, 'longitude': -9.09916305541992} -9.099163 38.806335 165000.0 165 000 € 1 False Lisboa 538 Loures 7881615 Santa Iria de Azoia, São João da Talha e Bobadela 2000 D Não 1 Lug. 1º Andar 1 -- 1 72 69
6 120611194-1600 120611194-1600 False {'latitude': 38.7786903381348, 'longitude': -9.17241954803467} -9.172420 38.778690 600000.0 600 000 € 1 False Lisboa 537 Lisboa 138643 Lumiar 2014 B- Sim 2 Lug. R/C 3 -- 2 190 125
7 120611837-4 120611837-4 False {'latitude': 38.8439788818359, 'longitude': -9.08877372741699} -9.088774 38.843979 182000.0 182 000 € 1 False Lisboa 538 Loures 7881615 Santa Iria de Azoia, São João da Talha e Bobadela 1993 C Sim Não 2º Andar 2 -- 1 88 67
8 120611853-32 120611853-32 False {'latitude': 38.6320686340332, 'longitude': -9.09872627258301} -9.098726 38.632069 100000.0 100 000 € 1 False Setúbal 608 Seixal 7881764 Seixal, Arrentela e Aldeia de Paio Pires 1964 C Não Não 1º Andar 2 -- 1 51 46
9 120612113-4 120612113-4 False {'latitude': 38.7784767150879, 'longitude': -9.24263477325439} -9.242635 38.778477 255000.0 255 000 € 1 False Lisboa 532 Amadora 7881439 Mina de Água 2006 B- Sim 2 Lug. R/C 2 -- 1 167 86
10 120612113-5 120612113-5 False {'latitude': 38.7622833251953, 'longitude': -9.23819446563721} -9.238194 38.762283 210000.0 210 000 € 1 False Lisboa 532 Amadora 7881294 Falagueira - Venda Nova 2006 C Sim 1 Lug. R/C 1 -- 1 135 97
11 120612160-2 120612160-2 False {'latitude': 38.6261711120605, 'longitude': -9.15865516662598} -9.158655 38.626171 279000.0 279 000 € 11 False Setúbal 608 Seixal 140194 Corroios 1990 E Não 1 Lug. -- 4 -- 3 240 127
12 120631511-30 120631511-30 False None NaN NaN 110000.0 110 000 € 1 False Setúbal 608 Seixal 7881764 Seixal, Arrentela e Aldeia de Paio Pires 1977 E Não Não 3º Andar 3 658 1 80 80
13 120631664-9 120631664-9 False {'latitude': 38.531177520752, 'longitude': -8.87638187408447} -8.876382 38.531178 139900.0 139 900 € 1 False Setúbal 610 Setúbal 140245 São Sebastião 1972 D Sim Não 2º Andar 2 -- 2 75 75
14 120691205-1 120691205-1 False {'latitude': 39.4176254272461, 'longitude': -9.13229751586914} -9.132298 39.417625 143000.0 143 000 € 21 False Leiria 520 Caldas da Rainha 7881728 Tornada e Salir do Porto 1957 NC Não Não -- -- 3750 0 3750 --
15 120781153-38 120781153-38 False {'latitude': 41.2283668518066, 'longitude': -8.64142227172852} -8.641422 41.228367 175000.0 175 000 € 1 False Porto 568 Matosinhos 7881259 Custóias, Leça do Balio e Guifões 2002 D Sim 1 Lug. R/C 2 133 2 108 108
16 120781302-3 120781302-3 False {'latitude': 41.1931915283203, 'longitude': -8.61899375915527} -8.618994 41.193192 150000.0 150 000 € 1 False Porto 568 Matosinhos 7881651 São Mamede de Infesta e Senhora da Hora 2001 C Sim 1 Lug. 2º Andar 2 -- 1 106 86
17 120781358-40 120781358-40 False {'latitude': 41.153190612793, 'longitude': -8.50793170928955} -8.507932 41.153191 340000.0 340 000 € 11 False Porto 564 Gondomar 7881295 Fânzeres e São Pedro da Cova 2021 NC Não 2 Lug. -- 3 215 3 252 252
18 120781358-41 120781358-41 False {'latitude': 41.153190612793, 'longitude': -8.50793170928955} -8.507932 41.153191 340000.0 340 000 € 11 False Porto 564 Gondomar 7881295 Fânzeres e São Pedro da Cova 2021 NC Não 2 Lug. -- 3 215 3 252 252
19 120961001-2485 120961001-2485 False {'latitude': 37.7316856384277, 'longitude': -25.3059501647949} -25.305950 37.731686 195000.0 195 000 € 11 False Ilha de São Miguel 505 Povoação 283094 Ribeira Quente 1937 NC Não Não -- 3 241 1 139 72
20 120991305-222 120991305-222 False {'latitude': 38.7449226379395, 'longitude': -9.17739295959473} -9.177393 38.744923 221000.0 221 000 € 1 False Lisboa 537 Lisboa 138664 São Domingos de Benfica 1962 C Sim Não 2º Andar 2 -- 1 64 64
21 120992059-967 120992059-967 False {'latitude': 38.8122749328613, 'longitude': -9.18933200836182} -9.189332 38.812275 255000.0 255 000 € 1 False Lisboa 965 Odivelas 7881567 Ramada e Caneças 2009 C Sim 1 Lug. 3º Andar 2 -- 2 86 86
22 120992059-968 120992059-968 False {'latitude': 38.7304840087891, 'longitude': -9.15713500976563} -9.157135 38.730484 1505000.0 1 505 000 € 1 False Lisboa 537 Lisboa 7881080 Avenidas Novas 2020 E Sim Não R/C 2 -- 3 229 229
23 120992059-969 120992059-969 False {'latitude': 38.7304840087891, 'longitude': -9.15713500976563} -9.157135 38.730484 1420000.0 1 420 000 € 1 False Lisboa 537 Lisboa 7881080 Avenidas Novas 2020 E Sim Não R/C 2 -- 3 222 222
24 120992059-970 120992059-970 False {'latitude': 38.7265014648438, 'longitude': -9.1189022064209} -9.118902 38.726501 180000.0 180 000 € 1 False Lisboa 537 Lisboa 138650 Penha de França 1988 D Sim Não 2º Andar 1 -- 1 36 36
25 121011219-134 121011219-134 False {'latitude': 38.7962646484375, 'longitude': -9.17248916625977} -9.172489 38.796265 195000.0 195 000 € 1 False Lisboa 965 Odivelas 175361 Odivelas 1981 D Sim Não 3º Andar 1 483 1 56 56
26 121121151-113 121121151-113 False {'latitude': 38.8020095825195, 'longitude': -9.35227012634277} -9.352270 38.802010 124000.0 124 000 € 1 False Lisboa 542 Sintra 140266 Algueirão-Mem Martins 1999 C Sim Não 3º Andar 2 -- 1 71 71
27 121161163-5 121161163-5 False {'latitude': 38.8054885864258, 'longitude': -9.18441772460938} -9.184418 38.805489 275000.0 275 000 € 1 False Lisboa 965 Odivelas 7881567 Ramada e Caneças 1999 C Sim 2 Lug. 3º Andar 3 -- 2 108 100
28 121291134-215 121291134-215 False {'latitude': 38.7944717407227, 'longitude': -9.19003963470459} -9.190040 38.794472 195000.0 195 000 € 1 False Lisboa 965 Odivelas 175361 Odivelas 2007 C Sim Não R/C 1 -- 1 91 91
29 121291340-14 121291340-14 False {'latitude': 39.0450019836426, 'longitude': -9.07592582702637} -9.075926 39.045002 25000.0 25 000 € 21 False Lisboa 531 Alenquer 136964 Carnota NaN NC Não Não -- -- -- 0 2720 2720
30 121701349-66 121701349-66 False {'latitude': 38.7021827697754, 'longitude': -9.23928546905518} -9.239285 38.702183 199000.0 199 000 € 1 False Lisboa 541 Oeiras 7881007 Algés, Linda-a-Velha e Cruz Quebrada-Dafundo 1973 D Não Não 1º Andar 2 -- 1 73 65
31 121701366-88 121701366-88 False {'latitude': 38.7669792175293, 'longitude': -9.2309045791626} -9.230905 38.766979 85000.0 85 000 € 21 False Lisboa 532 Amadora 7881439 Mina de Água NaN NC Não 3+ Lug. -- -- -- 0 298 --
32 121901124-824 121901124-824 False {'latitude': 38.9743232727051, 'longitude': -9.25524234771729} -9.255242 38.974323 190000.0 190 000 € 11 False Lisboa 540 Mafra 7881269 Enxara do Bispo, Gradil e Vila Franca do Rosário 1951 D Não 1 Lug. -- 2 4749 3 368 368
33 121901144-140 121901144-140 False {'latitude': 39.1354522705078, 'longitude': -9.30073642730713} -9.300736 39.135452 189000.0 189 000 € 21 False Lisboa 544 Torres Vedras 7880966 A dos Cunhados e Maceira NaN NC Não Não -- -- 37600 0 37600 --
34 121911089-381 121911089-381 False {'latitude': 41.2636184692383, 'longitude': -8.32836818695068} -8.328368 41.263618 65000.0 65 000 € 21 False Porto 565 Lousada 138741 Nevogilde NaN NC Não Não -- -- 1048 0 1048 --
35 121961781-19 121961781-19 False {'latitude': 38.7633514404297, 'longitude': -9.23866081237793} -9.238661 38.763351 125000.0 125 000 € 1 False Lisboa 532 Amadora 7881439 Mina de Água 1977 NC Não Não 1º Andar 3 -- 1 89 89
36 121981024-803 121981024-803 False {'latitude': 38.9900207519531, 'longitude': -9.08186721801758} -9.081867 38.990021 175000.0 175 000 € 1 False Lisboa 533 Arruda dos Vinhos 137323 Arruda dos Vinhos 1999 D Não 1 Lug. 3º Andar 3 -- 2 121 175
37 121981024-804 121981024-804 False {'latitude': 38.9046249389648, 'longitude': -9.04910373687744} -9.049104 38.904625 120000.0 120 000 € 1 False Lisboa 545 Vila Franca de Xira 7881029 Alverca do Ribatejo e Sobralinho 1995 D Não Não 1º Andar 2 -- 1 85 98
38 121981024-805 121981024-805 False {'latitude': 38.8650970458984, 'longitude': -9.07480335235596} -9.074803 38.865097 245000.0 245 000 € 1 False Lisboa 545 Vila Franca de Xira 7881554 Póvoa de Santa Iria e Forte da Casa 2000 D Sim 1 Lug. 5º Andar 3 -- 2 120 150
39 121981024-806 121981024-806 False {'latitude': 38.8922805786133, 'longitude': -9.03994464874268} -9.039945 38.892281 265000.0 265 000 € 1 False Lisboa 545 Vila Franca de Xira 7881029 Alverca do Ribatejo e Sobralinho 1994 D Sim Não 5º Andar 3 -- 2 120 120
40 122031100-118 122031100-118 False {'latitude': 40.6477584838867, 'longitude': -7.91024160385132} -7.910242 40.647758 235000.0 235 000 € 1 False Viseu 658 Viseu 7881845 Viseu 2017 A Sim 1 Lug. 4º Andar 3 -- 0 136 126
41 122141231-184 122141231-184 False {'latitude': 38.757698059082, 'longitude': -9.25005435943604} -9.250054 38.757698 75000.0 75 000 € 1 False Lisboa 542 Sintra 7881562 Queluz e Belas 1987 E Sim Não R/C 0 -- 0 44 44
42 122181417-24 122181417-24 False {'latitude': 38.8192291259766, 'longitude': -9.41029834747314} -9.410298 38.819229 547000.0 547 000 € 11 False Lisboa 542 Sintra 7881695 Sintra (Santa Maria e São Miguel, São Martinho e São Pedro de Penaferrim) 2005 C Não 3+ Lug. -- 4 322 4 227 180
43 122181450-61 122181450-61 False {'latitude': 38.7442321777344, 'longitude': -9.16665172576904} -9.166652 38.744232 450000.0 450 000 € 1 False Lisboa 537 Lisboa 138664 São Domingos de Benfica 1987 E Sim 1 Lug. 8º Andar 2 119 2 102 80
44 122191187-136 122191187-136 False {'latitude': 38.5499839782715, 'longitude': -8.877028465271} -8.877028 38.549984 549000.0 549 000 € 11 False Setúbal 610 Setúbal 140245 São Sebastião 2021 A Não 1 Lug. -- 4 476 3 266 266
45 122211023-377 122211023-377 False {'latitude': 41.2374954223633, 'longitude': -8.16340351104736} -8.163404 41.237495 47500.0 47 500 € 21 False Porto 567 Marco de Canaveses 138864 Banho e Carvalhosa NaN NC Não Não -- -- 763 0 150 150
46 122211023-378 122211023-378 False {'latitude': 41.2399864196777, 'longitude': -8.16735172271729} -8.167352 41.239986 90000.0 90 000 € 21 False Porto 561 Amarante 8081909 Vila Meã NaN NC Não Não -- -- 7650 0 7650 --
47 122541186-12 122541186-12 False {'latitude': 40.921012878418, 'longitude': -8.43076705932617} -8.430767 40.921013 71000.0 71 000 € 1 False Aveiro 382 Oliveira de Azeméis 139316 Fajões 2003 D Não 1 Lug. R/C 3 -- 2 137 137
48 122541186-13 122541186-13 False {'latitude': 40.921012878418, 'longitude': -8.43076705932617} -8.430767 40.921013 67500.0 67 500 € 1 False Aveiro 382 Oliveira de Azeméis 139316 Fajões 2003 C Não 1 Lug. R/C 3 -- 2 137 137
49 122541186-14 122541186-14 False {'latitude': 40.921012878418, 'longitude': -8.43076705932617} -8.430767 40.921013 71500.0 71 500 € 1 False Aveiro 382 Oliveira de Azeméis 139316 Fajões 2003 D Não 1 Lug. 1º Andar 3 -- 2 143 143
答案 1 :(得分:0)
请从下面的代码中得到一个想法。
Page_lists = driver.find_elements_by_xpath('/html/body/div[1]/div/div[1]/div/div[2]/div/div[2]/div/div[2]/div[1]/div/div')
element_list=[]
for list in Page_lists :
print(list.text)
time.sleep(2)
list.click()
time.sleep(1)
detalhes = driver.find_element_by_id('details').text
preço = driver.find_element_by_id('listing-price').text
tipo = driver.find_element_by_id('listing-title').text
freguesia = driver.find_element_by_xpath('//h5[@class="listing-address"]').text
imoveis = [detalhes, preço, tipo, freguesia]
print(imoveis)
element_list.append(imoveis)
driver.find_element_by_css_selector('body > div.fade.listing-details-desktop-component.modal.show > div > div > button').click()
print(element_list)