#python #selenium #web-scraping
Вопрос:
- Код скребка ниже
df = pd.DataFrame(columns=['Name', 'Address', 'Contact'])
driver = webdriver.Chrome(ChromeDriverManager().install())
url = 'www.website.com'
driver.get(url)
for _ in range(200):
print('url, driver, window, driver.get INITIALIZED', 'DF created')
name = driver.find_elements_by_class_name('pflist-itemtitle')
address = driver.find_elements_by_class_name('pflist-address')
contact = driver.find_elements_by_css_selector("a[href*='tel:']")
print('variables to name, address, contact ASSIGNED')
#Get names into a list
name_list = []
for a in range(len(name)):
name_list.append(name[a].text)
print('name scraped')
address_list = []
for b in range(len(address)):
address_list.append(address[b].text)
print('Address scraped')
contact_list = []
for c in range(len(contact)):
contact_list.append(contact[c].text)
print('Contact scraped')
data_tuples = list(zip(name_list[0:], address_list[0:], contact_list[0:])) # everything is paired together
temp_df = pd.DataFrame(data_tuples, columns=['Name', 'Address', 'Contact']) #creates temporary dataframe of each tuple in the field_listingtype
df = df.append(temp_df)
print('Data stored in dataframe')
driver.find_element_by_tag_name('body').send_keys(Keys.END)
element = driver.find_element_by_partial_link_text('Next »')
print('Is the button enabled : ' str(element.is_enabled()))
print('Is the button visible : ' str(element.is_displayed()))
element.click()
print('Next is clicked')
print('Finished scraping')
Для очистки требуется около 200 страниц в том же формате. Отсюда и цикл for. На каждой странице есть около 70 контактных карточек с именем, адресом, контактом. Я получил элементы селена, работающие с этими тремя, я протестировал. Это казалось нормальным, когда я проверил две страницы. Теперь я оставил все работать, и как только это было сделано, он успешно очистил все 200 страниц. Я сопоставил цифры с веб-сайтом и тем, что получил в DF. По-видимому, были некоторые карточки контактов, к которым не был прикреплен номер телефона, и python прикрепил следующий доступный номер к контакту без него. Следовательно, все номера не сдвинуты и не для правильного контакта. Как я могу избежать этого, используя какое-то утверждение «если», что, когда элемент номера телефона недоступен, он просто присоединяет какую-то строку «недоступно» в списке номеров телефонов?
- Еще один вопрос. Я заметил, что иногда совершенно не хватает одного-двух контактов. Может ли быть так, что он не успел вовремя, потому что на этот раз страница загружалась быстрее, чем в другие разы? Заранее благодарю.
Комментарии:
1. Можете ли вы поделиться URL-адресом? Может быть, решения с
beautifulsoup
будет достаточно…
Ответ №1:
Это программная ошибка. Посмотрите, что вы делаете, это берете все имена и сохраняете в списке и так далее с адресом и номером телефона, и вы предполагаете, что имя будет соответствовать адресу и номеру телефона в соответствующем месте, но представьте, что если значение отсутствует, как в вашем случае, это повлияет на соответствие.
Что вам нужно сделать, так это использовать один цикл for либо для имени, либо для адреса, т. е. предпочтительнее называть, потому что вероятность пропуска имени очень мала или вообще отсутствует. Итак, зацикливайтесь на длине имени.
name_List=[]
contact_List=[]
address_List=[]
i=0
while i<len(name):
name_List.append(name[i].text)
contac_List.append(contact[i].text)
address_List.append(address[i].text)
i=i 1
Это позволит убедиться, что ваши значения name_List, contact_List и address_List соответствуют друг другу. Поэтому для любого пропущенного значения в вашем списке будет сохранена пустая или пустая строка в этом месте.