如何从包含“URL”的网页中提取所有URL;“显示更多”;用Python?

如何从包含“URL”的网页中提取所有URL;“显示更多”;用Python?,python,web-scraping,Python,Web Scraping,我在webscraping领域是个新手,以前我用一个代码从包含多个页面的网站中提取URL,然后将它们保存在txt文件中。我想把它应用到一个新的网站,但它只有一个页面,但与“显示更多”按钮 以下是网页: 这是我的代码: import requests from bs4 import BeautifulSoup import time import pandas as pd links = [] for i in range(#221): url = 'http://sdg.ii

我在webscraping领域是个新手,以前我用一个代码从包含多个页面的网站中提取URL,然后将它们保存在txt文件中。我想把它应用到一个新的网站,但它只有一个页面,但与“显示更多”按钮

以下是网页:

这是我的代码:

import requests
from bs4 import BeautifulSoup
import time
import pandas as pd 



links = []

for i in range(#221):
    url = 'http://sdg.iisd.org/news/'  #+ str(i) <-- for webpage with many pages

    response = requests.get(url, headers={'User-agent': 'Mozilla/5.0'})

    if response.ok:
        print('Page: ' + str(i))
        soup = BeautifulSoup(response.text,'lxml')
        div = soup.findAll('article')
        for article in div:
            a = article.find('a')
            link = a['href']
            links.append('https://sdg.iisd.org/news' + link)

        print(len(links))

with open('urls.txt', 'w') as file:
    for link in links:
        file.write(link + '\n')
导入请求
从bs4导入BeautifulSoup
导入时间
作为pd进口熊猫
链接=[]
对于范围内的i(#221):

url='1〕http://sdg.iisd.org/news/“#+str(i)如果您记录浏览器的网络流量,您可以看到按
显示更多信息
按钮会向
发出XHR请求http://sdg.iisd.org/wp-admin/admin-ajax.php
通过HTTP POST,响应为HTML。您还可以从浏览器的开发工具复制POST负载。在
数据
有效负载字典中使用
页码
ppp
键值对,以获得不同的文章:

def main():
    import requests
    from bs4 import BeautifulSoup as Soup
    from operator import itemgetter

    url = "http://sdg.iisd.org/wp-admin/admin-ajax.php"

    data = {
        "template": "load_more",
        "post_type": "news",
        "sdgs": "",
        "issues": "",
        "globalpartnership": "",
        "actors": "",
        "actions": "",
        "regions": "",
        "behaviour": "exact",
        "sort_by": "DESC",
        "pageNumber": "1",
        "ppp": "12",
        "action": "more_post_ajax",
        "author": ""
    }

    response = requests.post(url, data=data)
    response.raise_for_status()

    soup = Soup(response.content, "html.parser")

    article_urls = list(map(itemgetter("href"), soup.select("article > a")))
    print(article_urls)
    
    return 0


if __name__ == "__main__":
    import sys
    sys.exit(main())
输出:

['http://sdg.iisd.org/news/wef-event-explores-ways-to-fix-international-trade-system/', 'http://sdg.iisd.org/news/wto-members-resume-negotiations-on-fisheries-subsidies/', 'http://sdg.iisd.org/news/informal-ministerial-highlights-role-of-trade-in-promoting-covid-19-recovery/', 'http://sdg.iisd.org/news/wto-imf-project-uneven-covid-19-recovery-across-and-within-countries/', 'http://sdg.iisd.org/news/53-wto-members-commit-to-ease-restrictions-on-humanitarian-food-aid/', 'http://sdg.iisd.org/news/development-goals-can-work-even-amid-crisis-but-we-need-to-measure-better/', 'http://sdg.iisd.org/news/unctad-partners-launch-tool-to-identify-exchange-traded-funds-with-sdg-alignment/', 'http://sdg.iisd.org/news/tool-helps-measure-quality-of-stakeholder-engagement-in-sdgs/', 'http://sdg.iisd.org/news/unctad-reveals-economic-slowdown-before-covid-19-provides-key-data-on-rcep-agreement/', 'http://sdg.iisd.org/news/unep-report-identifies-top-actions-to-minimize-adverse-impacts-of-pesticides-fertilizers/', 'http://sdg.iisd.org/news/regions-to-hold-sustainable-development-forums-ahead-of-2021-hlpf/', 'http://sdg.iisd.org/news/ndc-partnership-reflects-on-milestone-year-for-climate-ambition/']
>>> 

DevTools显示,单击“显示更多”将启动到
http://sdg.iisd.org/wp-admin/admin-ajax.php
包括参数
pageNumber=2
。有关其他参数和请求头,请参阅DevTools。