我一直在使用以下代码来解析链接 https://www.blogforacure.com/members.php 中的网页。该代码预计会返回给定页面的所有成员的链接。
from bs4 import BeautifulSoup
import urllib
r = urllib.urlopen('https://www.blogforacure.com/members.php').read()
soup = BeautifulSoup(r,'lxml')
headers = soup.find_all('h3')
print(len(headers))
for header in headers:
a = header.find('a')
print(a.attrs['href'])
但是我只从上面的页面获得了前 10 个链接。即使在打印美化选项时,我也只能看到前 10 个链接。
最佳答案
通过向 https://www.blogforacure.com/site/ajax/scrollergetentries.php
端点发出 AJAX 请求来动态加载结果。
使用 requests
在代码中模拟它们维护网络抓取 session :
from bs4 import BeautifulSoup
import requests
url = "https://www.blogforacure.com/site/ajax/scrollergetentries.php"
with requests.Session() as session:
session.headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'}
session.get("https://www.blogforacure.com/members.php")
page = 0
members = []
while True:
# get page
response = session.post(url, data={
"p": str(page),
"id": "#scrollbox1"
})
html = response.json()['html']
# parse html
soup = BeautifulSoup(html, "html.parser")
page_members = [member.get_text() for member in soup.select(".memberentry h3 a")]
print(page, page_members)
members.extend(page_members)
page += 1
它打印当前页码和每页的成员列表,并将成员名称累积到成员
列表中。不发布它打印的内容,因为它包含名称。
请注意,我故意让循环无限循环,请找出退出条件。可能是在 response.json()
抛出错误时。
关于python - 如何用漂亮的汤解析长网页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38502390/