【问题标题】:Collecting information by scraping通过抓取收集信息
【发布时间】:2020-03-28 19:06:59
【问题描述】:

我正在尝试通过抓取维基百科来收集政治家的姓名。 我需要从这个页面刮掉所有政党:https://it.wikipedia.org/wiki/Categoria:Politici_italiani_per_partito,然后为每个人刮掉该党内所有政治家的名字(对于我上面提到的链接中列出的每个政党)。

我写了以下代码:

from bs4 import BeautifulSoup as bs
import requests

res = requests.get("https://it.wikipedia.org/wiki/Categoria:Politici_italiani_per_partito")
soup = bs(res.text, "html.parser")
array1 = {}
possible_links = soup.find_all('a')
for link in possible_links:
    url = link.get("href", "")
    if "/wiki/Provenienza" in url: # It is incomplete, as I should scrape also links including word "Politici di/dei"
        res1=requests.get("https://it.wikipedia.org"+url)
        print("https://it.wikipedia.org"+url)
        soup = bs(res1, "html.parser")
        possible_links1 = soup.find_all('a')
        for link in possible_links1:
            url_1 = link.get("href", "")
            array1[link.text.strip()] = url_1

但它不起作用,因为它不会为每一方收集名称。它收集所有政党(来自我上面提到的维基百科页面):但是,当我尝试抓取政党的页面时,它不会收集该政党内政客的姓名。

我希望你能帮助我。

【问题讨论】:

  • 您的问题没有得到很好的描述。你说不收集每一方的名字是什么意思?
  • 它首先收集所有政党(来自我上面提到的维基百科页面):但是,当我尝试抓取政党的页面时,它不会收集该政党内政客的姓名。跨度>
  • 在您的代码中,您希望在哪里找到名称和各方?我无法理解您对 possible_links1array1 的意思
  • 我在那里遇到了困难。在选择了所有包含 /wiki/Provenienza 的链接(指向政党的链接)后,我需要抓取每个链接以获取该政党内政客的名字。我展示了代码,但它没有做我需要做的事情,因为它是错误的并且有很多错误。

标签: python python-3.x web-scraping


【解决方案1】:

您可以从第一页收集 url 和政党名称,然后循环这些 url 并将相关政治家名称的列表添加到以政党名称为键的字典中。您将通过使用会话对象来提高效率,从而重用底层 tcp 连接

from bs4 import BeautifulSoup as bs
import requests

results = {}

with requests.Session() as s: # use session object for efficiency of tcp re-use
    s.headers = {'User-Agent': 'Mozilla/5.0'}
    r = s.get('https://it.wikipedia.org/wiki/Categoria:Politici_italiani_per_partito')
    soup = bs(r.content, 'lxml')
    party_info = {i.text:'https://it.wikipedia.org/' + i['href'] for i in soup.select('.CategoryTreeItem a')} #dict of party names and party links

    for party, link in party_info.items():
        r = s.get(link)
        soup = bs(r.content, 'lxml')
        results[party] = [i.text for i in soup.select('.mw-content-ltr .mw-content-ltr a')] # get politicians names 

【讨论】:

    【解决方案2】:

    编辑:请参考上面 QHarr 的回答。

    我已经收集了所有的政党,仅此而已,我正在分享这段代码,当我得到所有政客时,我会编辑我的答案。

    from bs4 import BeautifulSoup as bs
    import requests
    
    res = requests.get("https://it.wikipedia.org/wiki/Categoria:Politici_italiani_per_partito")
    soup = bs(res.text, "html.parser")
    url_list = []
    politicians_dict = {}
    
    possible_links = soup.find_all('a')
    for link in possible_links:
        url = link.get("href", "")
        if (("/wiki/Provenienza" in url) or ("/wiki/Categoria:Politici_d" in url)):
            full_url = "https://it.wikipedia.org"+url
            url_list.append(full_url)
    
    for url in url_list:
        print(url)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2020-07-10
      • 2016-05-23
      • 1970-01-01
      • 2014-06-18
      • 1970-01-01
      相关资源
      最近更新 更多