我正在尝试抓取以下网站:
https://www.bandsintown.com/?came_from=257&sort_by_filter=Number+of+RSVPs
使用以下代码,我可以使用beautifulsoup成功抓取页面上列出的事件:
from bs4 import BeautifulSoup
import requests
url = 'https://www.bandsintown.com/?came_from=257&sort_by_filter=Number+of+RSVPs'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
dates = soup.find_all('div', {'class': 'event-b58f7990'})
month=[]
day=[]
for i in dates:
md = i.find_all('div')
month.append(md[0].text)
day.append(md[1].text)
但是,我遇到的问题是,我只能抓取前18个事件-仅当单击底部的“查看全部”按钮时,页面的其余部分才可用。在beautifulsoup中,有没有一种方法可以模拟此按钮的单击,以便我可以抓取所有数据?我更喜欢将其保留在python中,因为我大多数时候都使用beautifulsoup进行抓取。非常感谢!
答案 0 :(得分:2)
如果您可以在下面计算出终点或为范围设置终点(错误处理过头),则可以获取json响应并按以下方式解析出所需的信息。根据发出的请求数量,您可以选择重新使用会话连接。
import requests
import pandas as pd
url = 'https://www.bandsintown.com/upcomingEvents?came_from=257&sort_by_filter=Number+of+RSVPs&page={}&latitude=51.5167&longitude=0.0667'
results = []
for page in range(1,20):
data = requests.get(url.format(page)).json()
for item in data['events']:
results.append([item['artistName'], item['eventDate']['day'],item['eventDate']['month']])
df = pd.DataFrame(results)
print(df)