Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PythonWeb抓取-如何抓取这种类型的站点?_Python_Web Scraping_Beautifulsoup_Python Requests - Fatal编程技术网

PythonWeb抓取-如何抓取这种类型的站点?

PythonWeb抓取-如何抓取这种类型的站点?,python,web-scraping,beautifulsoup,python-requests,Python,Web Scraping,Beautifulsoup,Python Requests,好的,我需要抓取以下网页: 这是一个API列表。大约有22000个API需要清理 我需要: 1) 获取表中每个API的URL(第1-889页),并获取以下信息: API名称 描述 类别 提交 2) 然后,我需要从每个URL中获取一组信息 3) 将数据导出到CSV 问题是,我有点不知道该如何思考这个项目。据我所见,没有AJAX调用来填充表,这意味着我必须直接解析HTML(对吗?) 在我看来,逻辑是这样的: 使用requests&BS4库刮表 然后,以某种方式从每一行获取HREF 访问该H

好的,我需要抓取以下网页:

这是一个API列表。大约有22000个API需要清理


我需要:

1) 获取表中每个API的URL(第1-889页),并获取以下信息:

  • API名称
  • 描述
  • 类别
  • 提交
2) 然后,我需要从每个URL中获取一组信息

3) 将数据导出到CSV


问题是,我有点不知道该如何思考这个项目。据我所见,没有AJAX调用来填充表,这意味着我必须直接解析HTML(对吗?)


在我看来,逻辑是这样的:

  • 使用requests&BS4库刮表

  • 然后,以某种方式从每一行获取HREF

  • 访问该HREF,刮取数据,移动到下一个

  • 冲洗并对所有表格行重复


  • 我是否在正确的轨道上,这是否适用于请求和BS4

    以下是我一直试图解释的一些内容


    非常感谢你的帮助。这伤了我的头哈哈

    如果你想继续的话,你应该读更多关于刮的内容

    from bs4 import BeautifulSoup
    import csv , os , requests
    from urllib import parse
    
    
    def SaveAsCsv(list_of_rows):
        try:
            with open('data.csv', mode='a',  newline='', encoding='utf-8') as outfile:
                csv.writer(outfile).writerow(list_of_rows)
        except PermissionError:
            print("Please make sure data.csv is closed\n")
    
    if os.path.isfile('data.csv') and os.access('data.csv', os.R_OK):
        print("File data.csv Already exists \n")
    else:
        SaveAsCsv([ 'api_name','api_link','api_desc','api_cat'])
    BaseUrl = 'https://www.programmableweb.com/category/all/apis?deadpool=1&page={}'
    for i in range(1, 890):
        print('## Getting Page {} out of 889'.format(i))    
        url = BaseUrl.format(i)
        res = requests.get(url)
        soup = BeautifulSoup(res.text,'html.parser')
        table_rows = soup.select('div.view-content > table[class="views-table cols-4 table"] > tbody tr')
        for row in table_rows:
            tds = row.select('td')
            api_name = tds[0].text.strip()
            api_link = parse.urljoin(url, tds[0].find('a').get('href'))
            api_desc = tds[1].text.strip()
            api_cat  = tds[2].text.strip()  if len(tds) >= 3 else ''
            SaveAsCsv([api_name,api_link,api_desc,api_cat])
    

    这里我们使用
    请求
    美化组
    熊猫

    import requests
    from bs4 import BeautifulSoup
    import pandas as pd
    
    url = 'https://www.programmableweb.com/category/all/apis?deadpool=1&page='
    
    num = int(input('How Many Page to Parse?> '))
    print('please wait....')
    name = []
    desc = []
    cat = []
    sub = []
    for i in range(0, num):
        r = requests.get(f"{url}{i}")
        soup = BeautifulSoup(r.text, 'html.parser')
        for item1 in soup.findAll('td', attrs={'class': 'views-field views-field-title col-md-3'}):
            name.append(item1.text)
        for item2 in soup.findAll('td', attrs={'class': 'views-field views-field-search-api-excerpt views-field-field-api-description hidden-xs visible-md visible-sm col-md-8'}):
            desc.append(item2.text)
        for item3 in soup.findAll('td', attrs={'class': 'views-field views-field-field-article-primary-category'}):
            cat.append(item3.text)
        for item4 in soup.findAll('td', attrs={'class': 'views-field views-field-created'}):
            sub.append(item4.text)
    
    result = []
    for item in zip(name, desc, cat, sub):
        result.append(item)
    
    df = pd.DataFrame(
        result, columns=['API Name', 'Description', 'Category', 'Submitted'])
    df.to_csv('output.csv')
    
    print('Task Completed, Result saved to output.csv file.')
    
    结果可在线查看:

    输出简单:

    现在进行
    href
    解析:

    import requests
    from bs4 import BeautifulSoup
    import pandas as pd
    
    url = 'https://www.programmableweb.com/category/all/apis?deadpool=0&page='
    
    num = int(input('How Many Page to Parse?> '))
    print('please wait....')
    
    links = []
    for i in range(0, num):
        r = requests.get(f"{url}{i}")
        soup = BeautifulSoup(r.text, 'html.parser')
        for link in soup.findAll('td', attrs={'class': 'views-field views-field-title col-md-3'}):
            for href in link.findAll('a'):
                result = 'https://www.programmableweb.com'+href.get('href')
                links.append(result)
    
    spans = []
    for link in links:
        r = requests.get(link)
        soup = soup = BeautifulSoup(r.text, 'html.parser')
        span = [span.text for span in soup.select('div.field span')]
        spans.append(span)
    
    data = []
    for item in spans:
        data.append(item)
    
    df = pd.DataFrame(data)
    df.to_csv('data.csv')
    print('Task Completed, Result saved to data.csv file.')
    
    在线检查结果:

    示例视图如下:

    如果您希望将这2个
    csv
    文件放在一起,那么代码如下:

    import pandas as pd
    
    a = pd.read_csv("output.csv")
    b = pd.read_csv("data.csv")
    merged = a.merge(b)
    merged.to_csv("final.csv", index=False)
    

    在线结果:

    到目前为止,您尝试了什么!你在问什么问题?如果你只是问BS4和请求是否可行,答案(很可能)是肯定的。@aԋ625;ҽԃαМєιcαη我每天都刮,所以只需稍微调整一下。尽管如此,还是为自己的幸运投票吧。哇!这是一个很大的帮助,我已经研究了将近一个小时的代码,从现在起我将使用它作为参考。非常感谢你!我有一个问题,使用panda-是否可以提取非表元素。更特别的是,页面中显示“SDK”、“文章”、“如何”等数字的部分。这是一个
      带有class=“nav nav tabs menu hidden xs listprofile display count style”。@Luke i花了数小时处理您的案例:)。如果我满足了你的目标,请接受我的回答。不客气,兄弟。@Luke-Aha我有你的问题,例如
      https://www.programmableweb.com/api/google-maps
      那么你想提取
      SDK
      ?@Luke你确实可以通过
      beautifulsoup
      来实现
      pandas
      是Python编程语言中易于使用的数据结构和数据分析工具。绝对要读!你帮了我很多忙!是的,SDK以及该部分中的其他信息。是否可以将上述所有数据写入同一个CSV文件?