通过使用请求的循环从多个/动态页面(通过基本url和查询参数访问)中获取/抓取数据



所以我一直在尝试从网站上抓取一些数据作为练习来磨练我的python技能。该页面包含包含公司详细信息的卡片列表(似乎每页50张),下面的导航指向基础url +页码参数,如https://clutch.co/uk/app-developers?page=3

我被困在一个点上,如果我为每个url(基础url +页码参数)创建新的请求,并使用多个(post)请求获得数据,数据被正确获取(new data for each url just as I wanted),但是当我把这些步骤放在循环(generating the url through for loop and params)中时,我只从第一页获得结果(尽管结果重复了在循环中指定的时间)。

下面是我尝试过的两种不同结果的代码:
#Base code for the project 
import requests
from bs4 import BeautifulSoup as bs
base_url = 'https://clutch.co/uk/app-developers?page='
urls = [base_url + str(x) for x in range(0, 21)]
s = requests.Session()
#Function to extract link href from each element in bs4 object
def get_profile_link(profile_links, profiles=[]):
for link in profile_links:
profiles.append(link['href'])
return profiles

方法1:这工作,并给我的数据从2页(100个独特的结果)

r1 = s.post(urls[0])
soup1 = bs(r1.content)
links1 = soup1.find_all('a', attrs={'data-link_text': "Profile Button"})
list1 = get_profile_link(links1)
r2 = s.post(urls[1])
soup2 = bs(r2.content)
links2 = soup2.find_all('a', attrs={'data-link_text': "Profile Button"})
list2 = get_profile_link(links2, list1)

方法2:然而,这不起作用,给了我100个结果,只有50个唯一的值

#A simplified version of loop to fetch results (I have a slightly complex one that generates url within the loop). 
for x in range(0, 2):
r = s.post(urls[x])
soup = bs(r.content)
links = soup.find_all('a', attrs={'data-link_text': "Profile Button"})
list = get_profile_link(links)

寻找我在方法2中做错的指导,所以我可以使用loop来提取链接。我认为它可能通过使用cookie工作,我检查了print(r.cookies),似乎cookie没有生成/空。我通读了一遍文档,但还是没弄清楚。

如果需要进一步的细节请告诉我。

最好不要在函数中使用列表默认参数(例如:profiles=[])。

另外,不要使用内置名称作为变量名(例如:list)。

import requests
from bs4 import BeautifulSoup as bs
# Function to extract link href from each element in bs4 object
def get_profile_link(profile_links):
rv = []
for link in profile_links:
rv.append(link["href"])
return rv

all_data = []
base_url = "https://clutch.co/uk/app-developers?page="
with requests.session() as s:
for page in range(0, 2):
url = base_url + str(page)
soup = bs(s.post(url).content, "html.parser")
links = soup.find_all("a", attrs={"data-link_text": "Profile Button"})
all_data.extend(get_profile_link(links))
print("Length of data:", len(all_data))
print("Unique elements:", len(set(all_data)))

打印:

Length of data: 100
Unique elements: 100