为了账号安全,请及时绑定邮箱和手机立即绑定

在使用请求的某个页面之后无法解析链接

在使用请求的某个页面之后无法解析链接

潇潇雨雨 2022-06-22 15:30:58
我使用 python 创建了一个脚本来解析遍历多个页面的不同项目的链接。为了从它的登录页面解析链接,get请求也可以工作,所以我get在第一页使用了请求。但是,需要发出带有适当参数的发布请求才能从下一页获取链接。我也这样做了。该脚本现在可以解析最多 11 个页面的链接。当它在第 12 页之后出现问题,依此类推。该脚本不再起作用。我尝试了不同的页面,例如 20,50,100,150。没有一个成功。我试过:import timeimport requestsfrom bs4 import BeautifulSoupres_url = 'https://www.brcdirectory.com/InternalSite//Siteresults.aspx?'params = {    'CountryId': '0',    'CategoryId': '49bd499b-bc70-4cac-9a29-0bd1f5422f6f',    'StandardId': '972f3b26-5fbd-4f2c-9159-9a50a15a9dde'}with requests.Session() as s:    page = 11    while True:        print("**"*5,"trying with page:",page)        req = s.get(res_url,params=params)        soup = BeautifulSoup(req.text,"lxml")        if page==1:            for item_link in soup.select("h4 > a.colorBlue[href]"):                print(item_link.get("href"))        else:            payload = {i['name']:i.get('value') for i in soup.select('input[name]')}            payload['__EVENTTARGET'] = 'ctl00$ContentPlaceHolder1$gv_Results'            payload['__EVENTARGUMENT'] = f"{'Page$'}{page}"            payload['ctl00$ContentPlaceHolder1$ddl_SortValue'] = 'SiteName'        res = s.post(res_url,params=params,data=payload)        sauce = BeautifulSoup(res.text,"lxml")        if not sauce.select("h4 > a.colorBlue[href]"):break        for elem_link in sauce.select("h4 > a.colorBlue[href]"):            print(elem_link.get("href"))        page+=1        time.sleep(3)如何使用请求在 11 页后抓取链接?
查看完整描述

1 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

我认为您的抓取逻辑是正确的,但是在您的循环中,您每次都在执行 GET + POST,而您应该第一次执行 GET,然后为下一次迭代发出 POST(如果您想要 1 次迭代 = 1 页)


一个例子 :


import requests

from bs4 import BeautifulSoup


res_url = 'https://www.brcdirectory.com/InternalSite//Siteresults.aspx?'


params = {

    'CountryId': '0',

    'CategoryId': '49bd499b-bc70-4cac-9a29-0bd1f5422f6f',

    'StandardId': '972f3b26-5fbd-4f2c-9159-9a50a15a9dde'

}


max_page = 20


def extract(page, soup):

    for item_link in soup.select("h4 a.colorBlue"):

        print("for page {} - {}".format(page, item_link.get("href")))


def build_payload(page, soup):

    payload = {}

    for input_item in soup.select("input"):

        payload[input_item["name"]] = input_item["value"]

    payload["__EVENTTARGET"]="ctl00$ContentPlaceHolder1$gv_Results"

    payload["__EVENTARGUMENT"]="Page${}".format(page)

    payload["ctl00$ContentPlaceHolder1$ddl_SortValue"] = "SiteName"

    return payload


with requests.Session() as s:

    for page in range(1, max_page):

        if (page > 1):

            req = s.post(res_url, params = params, data = build_payload(page, soup))

        else:

            req = s.get(res_url,params=params)

        soup = BeautifulSoup(req.text,"lxml")

        extract(page, soup)


查看完整回答
反对 回复 2022-06-22
  • 1 回答
  • 0 关注
  • 192 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号