使用漂亮的汤来模拟页面单击,以访问页面上的所有HTML?

时间:2019-01-07 01:00:26

标签: python web-scraping beautifulsoup

我正在尝试抓取以下网站:

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进行抓取。非常感谢!

1 个答案:

答案 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)