Перестал работать Yellow Pages Scraper в Python
Я пытаюсь собрать данные из Желтых страниц. Я успешно использовал этот скребок несколько раз, но недавно он перестал работать. Я заметил недавнее изменение на сайте Желтых страниц, где они добавили таблицу Sponsored Links, которая содержит три результата. После этого изменения мой скребок обнаруживает только рекламу под этой таблицей рекламных ссылок. Он не получает никаких результатов.
Куда я в этом ошибаюсь?
Я включил свой код ниже. В качестве примера показан поиск по 7 Одиннадцати местам в Висконсине.
import requests
from bs4 import BeautifulSoup
import csv
my_url = "https://www.yellowpages.com/search?search_terms=7-eleven&geo_location_terms=WI&page={}"
for link in [my_url.format(page) for page in range(1,20)]:
res = requests.get(link)
soup = BeautifulSoup(res.text, "lxml")
placeHolder = []
for item in soup.select(".info"):
try:
name = item.select("[itemprop='name']")[0].text
except Exception:
name = ""
try:
streetAddress = item.select("[itemprop='streetAddress']")[0].text
except Exception:
streetAddress = ""
try:
addressLocality = item.select("[itemprop='addressLocality']")[0].text
except Exception:
addressLocality = ""
try:
addressRegion = item.select("[itemprop='addressRegion']")[0].text
except Exception:
addressRegion = ""
try:
postalCode = item.select("[itemprop='postalCode']")[0].text
except Exception:
postalCode = ""
try:
phone = item.select("[itemprop='telephone']")[0].text
except Exception:
phone = ""
with open('yp-7-eleven-wi.csv', 'a') as csv_file:
writer = csv.writer(csv_file)
writer.writerow([name, streetAddress, addressLocality, addressRegion, postalCode, phone])
2 ответа
Есть несколько проблем в вашем существующем скрипте. Вы создали цикл for, который должен проходить через 19 различных страниц, тогда как контент ограничен одной страницей. Определенные вами селекторы больше не содержат этих элементов. Морове, ты репетировал try:except
блокируйте несколько раз, что придало вашему скребку беспорядочный вид. Вы можете определить пользовательскую функцию, чтобы избавиться от IndexError
или же AttributeError
проблемы. Наконец, вы можете использовать csv.DictWriter()
записать очищенные элементы в CSV-файл.
Дать ему шанс:
import requests
import csv
from bs4 import BeautifulSoup
url = "https://www.yellowpages.com/search?search_terms=7-eleven&geo_location_terms=WI&page=1"
res = requests.get(url)
soup = BeautifulSoup(res.text, "lxml")
def get_text(item,path): return item.select_one(path).text if item.select_one(path) else ""
placeHolder = []
for item in soup.select(".info"):
d = {}
d['name'] = get_text(item,"a.business-name span")
d['streetAddress'] = get_text(item,".street-address")
d['addressLocality'] = get_text(item,".locality")
d['addressRegion'] = get_text(item,".locality + span")
d['postalCode'] = get_text(item,".locality + span + span")
d['phone'] = get_text(item,".phones")
placeHolder.append(d)
with open("yellowpageInfo.csv","w",newline="") as infile:
writer = csv.DictWriter(infile,['name','streetAddress','addressLocality','addressRegion','postalCode','phone'])
writer.writeheader()
for elem in placeHolder:
writer.writerow(elem)
Царапающая жизнь... борьба реальна!
Когда сайт меняет свой макет, часто могут быть изменения в элементах и именах классов. Вы хотите тщательно проверять обновления и исправлять в своем скребке все, что использует жестко закодированные значения, привязанные к элементам страницы, именам классов и т. Д., Которые могли измениться.
Быстрый осмотр страницы показывает, что информация, которую вы собираете, размещена в другой структуре:
<div class="v-card">
<div class="media-thumbnail"><a class="media-thumbnail-wrapper chain-img" href="/milwaukee-wi/mip/7-eleven-471900245?lid=471900245"
data-analytics="{"click_id":509}" data-impressed="1"><img class="lazy" alt="7-Eleven" src="//i2.ypcdn.com/blob/c625613c07118f48908d08ec3c5f5f9a9f813850_40.png?074020d"
data-original="//i2.ypcdn.com/blob/c625613c07118f48908d08ec3c5f5f9a9f813850_40.png?074020d" width="40"
height="40" style="display: block;"><noscript><img alt="7-Eleven" src="//i2.ypcdn.com/blob/c625613c07118f48908d08ec3c5f5f9a9f813850_40.png?074020d"
width="40" height="40"></noscript></a></div>
<div class="info">
<h2 class="n">2. <a class="business-name" href="/milwaukee-wi/mip/7-eleven-471900245?lid=471900245"
data-analytics="{"target":"name","feature_click":""}" rel=""
data-impressed="1"><span>7-Eleven</span></a></h2>
<div class="info-section info-primary">
<div class="ratings" data-israteable="true"></div>
<p class="adr"><span class="street-address">1624 W Wells St</span><span class="locality">Milwaukee, </span><span>WI</span> <span>53233</span></p>
<div class="phones phone primary">(414) 342-9710</div>
</div>
<div class="info-section info-secondary">
<div class="categories"><a href="/wi/convenience-stores" data-analytics="{"click_id":1171,"adclick":false,"listing_features":"category","events":""}"
data-impressed="1">Convenience Stores</a></div>
<div class="links"><a class="track-visit-website" href="https://www.7-eleven.com/locations/wi/milwaukee/1624-w-wells-st-35836?yext=35836"
rel="nofollow" target="_blank" data-analytics="{"click_id":6,"act":2,"dku":"https://www.7-eleven.com/locations/wi/milwaukee/1624-w-wells-st-35836?yext=35836","FL":"url","target":"website","LOC":"https://www.7-eleven.com/locations/wi/milwaukee/1624-w-wells-st-35836?yext=35836","adclick":true}"
data-impressed="1">Website</a></div>
</div>
<div class="preferred-listing-features"></div>
<div class="snippet">
<p class="body"><span>From Business: At 7-Eleven, our doors are always open, and our friendly store teams
are ready to serve you. Our fresh, fast and convenient hot foods appeal to any craving, so yo…</span></p>
</div>
</div>
</div>
Например, для адреса, а не itemprop=address
вам нужно .street-address
, и так далее.
В итоге:
Исправьте эти жестко запрограммированные значения, чтобы они соответствовали новым именам классов, и вы должны вернуться к делу.