访问隐藏选项卡,使用 Python 3.6 进行网页抓取
Accessing Hidden Tabs, Web Scraping With Python 3.6
我在 python 3.6 中使用 bs4 和 urllib.request 进行网络抓取。我必须打开选项卡/能够在按钮选项卡中切换 "aria-expanded" 才能访问我需要的 div 选项卡。
标签关闭时的按钮标签如下用<>代替--:
button id="0-accordion-tab-0" type="button" class="accordion-panel-title u-padding-ver-s u-text-left text-l js-accordion-panel-title" aria-controls="0-accordion-panel-0" aria-展开="false"
打开后,aria-expanded="true" 和 div 选项卡出现在下方。
知道怎么做吗?
非常感谢您的帮助。
BeautifulSoup
用于解析HTML/XML内容。你不能用它点击网页。
我建议您通读文档以确保它不仅仅是将内容从一个地方移动到另一个地方。如果单击按钮时通过 AJAX 加载内容,那么您将必须使用 selenium
之类的东西来触发单击。
一个更简单的选择是检查 url 当您单击按钮时获取内容的来源,并在可能的情况下在您的脚本中进行类似的调用。
从你的另一个 post 我猜 URL 是 https://www.sciencedirect.com/journal/construction-and-building-materials/issues
单击 link 时,网页会从另一个 URL 加载 JSON。您可以自己请求 JSON 而无需单击 link。您只需要知道永远不会改变的 ISBN (09500618) 和您可以从一个范围传入的年份。这甚至 returns 来自已展开选项卡的数据。
import requests
import json
# The website rejects requests except from user agents it has not blacklisted so set a header
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0'
}
for i in range (1999, 2019):
url = "https://www.sciencedirect.com/journal/09500618/year/" + str(i) + "/issues"
r = requests.get(url, headers=headers)
j = r.json()
for d in j['data']:
# Print the json object
print (json.dumps(d, indent=4, sort_keys=True))
# Or print specific values
print (d['coverDateText'], d['volumeFirst'], d['uriLookup'], d['srctitle'])
输出:
{
"cid": "271475",
"contentFamily": "serial",
"contentType": "JL",
"coverDateStart": "19991201",
"coverDateText": "1 December 1999",
"hubStage": "H300",
"issn": "09500618",
"issueFirst": "8",
"pages": [
{
"firstPage": "417",
"lastPage": "470"
}
],
"pii": "S0950061800X00323",
"sortField": "1999001300008zzzzzzz",
"srctitle": "Construction and Building Materials",
"uriLookup": "/vol/13/issue/8",
"volIssueSupplementText": "Volume 13, Issue 8",
"volumeFirst": "13"
}
1 December 1999 13 /vol/13/issue/8 Construction and Building Materials
...
我在 python 3.6 中使用 bs4 和 urllib.request 进行网络抓取。我必须打开选项卡/能够在按钮选项卡中切换 "aria-expanded" 才能访问我需要的 div 选项卡。
标签关闭时的按钮标签如下用<>代替--:
button id="0-accordion-tab-0" type="button" class="accordion-panel-title u-padding-ver-s u-text-left text-l js-accordion-panel-title" aria-controls="0-accordion-panel-0" aria-展开="false"
打开后,aria-expanded="true" 和 div 选项卡出现在下方。
知道怎么做吗?
非常感谢您的帮助。
BeautifulSoup
用于解析HTML/XML内容。你不能用它点击网页。
我建议您通读文档以确保它不仅仅是将内容从一个地方移动到另一个地方。如果单击按钮时通过 AJAX 加载内容,那么您将必须使用 selenium
之类的东西来触发单击。
一个更简单的选择是检查 url 当您单击按钮时获取内容的来源,并在可能的情况下在您的脚本中进行类似的调用。
从你的另一个 post 我猜 URL 是 https://www.sciencedirect.com/journal/construction-and-building-materials/issues
单击 link 时,网页会从另一个 URL 加载 JSON。您可以自己请求 JSON 而无需单击 link。您只需要知道永远不会改变的 ISBN (09500618) 和您可以从一个范围传入的年份。这甚至 returns 来自已展开选项卡的数据。
import requests
import json
# The website rejects requests except from user agents it has not blacklisted so set a header
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0'
}
for i in range (1999, 2019):
url = "https://www.sciencedirect.com/journal/09500618/year/" + str(i) + "/issues"
r = requests.get(url, headers=headers)
j = r.json()
for d in j['data']:
# Print the json object
print (json.dumps(d, indent=4, sort_keys=True))
# Or print specific values
print (d['coverDateText'], d['volumeFirst'], d['uriLookup'], d['srctitle'])
输出:
{
"cid": "271475",
"contentFamily": "serial",
"contentType": "JL",
"coverDateStart": "19991201",
"coverDateText": "1 December 1999",
"hubStage": "H300",
"issn": "09500618",
"issueFirst": "8",
"pages": [
{
"firstPage": "417",
"lastPage": "470"
}
],
"pii": "S0950061800X00323",
"sortField": "1999001300008zzzzzzz",
"srctitle": "Construction and Building Materials",
"uriLookup": "/vol/13/issue/8",
"volIssueSupplementText": "Volume 13, Issue 8",
"volumeFirst": "13"
}
1 December 1999 13 /vol/13/issue/8 Construction and Building Materials
...