[英]Web scraping from multiple pages with for loop
我创建了 web 抓取工具,用于从上市房屋中提取数据。
我在更改页面时遇到问题。 我确实从 1 到某个数字对 go 进行了循环。
问题是这样的:在这个 web 页面中,最后一个“页面”可能一直不同。 现在它是 70,但明天它可以是 68 或 72。如果我的范围例如为 (1-74),它将多次打印最后一页,因为如果 go 超过最大值,页面总是加载最后一页。
html: https://www.etuovi.com/myytavat-asunnot/oulu?haku=M1582971026&sivu=1000 <----如果你这样会自动打开最后一页(70), 70) 射程的次数。
那么如何让这个循环在达到最大数量时停止呢?
for sivu in range(1, 100):
req = requests.get(my_url + str(sivu))
page_soup = soup(req.text, "html.parser")
containers = page_soup.findAll("div", {"class": "ListPage__cardContainer__39dKQ"})
谢谢
使用您提供的网站,您可以通过抓取按钮文本来获得最大范围。
import requests
from bs4 import BeautifulSoup as bs
url='https://www.etuovi.com/myytavat-asunnot/oulu?haku=M1582971026&sivu=1000'
page=requests.get(url)
soup = bs(page.content,'html.parser')
last_page = None
pages = []
buttons=soup.find_all('button', class_= "Pagination__button__3H2wX")
for button in buttons:
pages.append(button.text)
print(pages)
Output:['1','68','69','70']
最后一个元素将是最后一页,我能够使用class_= "Pagination__button__3H2wX"
获取按钮。 您可以只获取数组的最后一个元素并将其用作循环的限制。 但请注意,这可能会根据网站的 web 开发人员是否决定更改这些按钮上的内容而改变。
所以这是我现在的代码。 出于某种原因,我仍然无法继续。 有任何想法吗?
错误:
回溯(最后一次调用):文件“C:/Users/Käyttäjä/PycharmProjects/Etuoviscaper/etuovi.py”,第 29 行,在容器中 = page_soup.find("div", {"class": "ListPage__cardContainer__39dKQ"})文件“C:\Users\Käyttäjä\PycharmProjects\Etuoviscaper\venv\lib\site-packages\bs4\element.py”,第 2173 行,在getattr中引发 AttributeError(AttributeError:ResultSet object 没有属性“find”。你是可能将元素列表视为单个元素。当您打算调用 find() 时是否调用了 find_all()?
import bs4
from bs4 import BeautifulSoup as soup
from urllib.request import urlopen as uReq
import re
import requests
my_url = 'https://www.etuovi.com/myytavat-asunnot/oulu?haku=M1582971026&sivu=1'
filename = "asunnot.csv"
f = open(filename, "w")
headers = "Neliöt; Hinta; Osoite; Kaupunginosa; Kaupunki; Huoneistoselitelmä; Rakennusvuosi\n"
f.write(headers)
page = requests.get(my_url)
soup = soup(page.content, 'html.parser')
pages = []
buttons = soup.findAll("button", {"class": "Pagination__button__3H2wX"})
for button in buttons:
pages.append(button.text)
last_page = int(pages[-1])
for sivu in range(1, last_page):
req = requests.get(my_url + str(sivu))
page_soup = soup(req.text, "html.parser")
containers = page_soup.findAll("div", {"class": "ListPage__cardContainer__39dKQ"})
for container in containers:
size_list = container.find("div", {"class": "flexboxgrid__col-xs__26GXk flexboxgrid__col-md-4__2DYW-"}).text
size_number = re.findall("\d+\,*\d+", size_list)
size = ''.join(size_number) # Asunnon koko neliöinä
prize_line = container.find("div", {"class": "flexboxgrid__col-xs-5__1-5sb flexboxgrid__col-md-4__2DYW-"}).text
prize_number_list = re.findall("\d+\d+", prize_line)
prize = ''.join(prize_number_list[:2]) # Asunnon hinta
address_city = container.h4.text
address_list = address_city.split(', ')[0:1]
address = ' '.join(address_list) # osoite
city_part = address_city.split(', ')[-2] # kaupunginosa
city = address_city.split(', ')[-1] # kaupunki
type_org = container.h5.text
type = type_org.replace("|", "").replace(",", "").replace(".", "") # asuntotyyppi
year_list = container.find("div", {"class": "flexboxgrid__col-xs-3__3Kf8r flexboxgrid__col-md-4__2DYW-"}).text
year_number = re.findall("\d+", year_list)
year = ' '.join(year_number)
print("pinta-ala: " + size)
print("hinta: " + prize)
print("osoite: " + address)
print("kaupunginosa: " + city_part)
print("kaupunki: " + city)
print("huoneistoselittelmä: " + type)
print("rakennusvuosi: " + year)
f.write(size + ";" + prize + ";" + address + ";" + city_part + ";" + city + ";" + type + ";" + year + "\n")
f.close()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.