【问题标题】:web-scraping error message: 'int' object has no attribute 'get'网络抓取错误消息:“int”对象没有属性“get”
【发布时间】:2023-03-17 10:02:02
【问题描述】:

您好 Stack Overflow 贡献者!

我想抓取一个新闻网站的多个页面;它在此步骤中显示错误消息

 response = requests.get(page, headers = user_agent)

错误信息是

AttributeError: 'int' object has no attribute 'get'

代码行是

user_agent = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko'}

#controlling the crawl-rate
start_time = time() 
request = 0

def scrape(url):
    urls = [url + str(x) for x in range(0,10)]
    for page in urls:
        response = requests.get(page, headers = user_agent)   
    print(page)
       
print(scrape('https://nypost.com/search/China+COVID-19/page/'))

更具体地说,这个页面和它旁边的页面是我要抓取的:

https://nypost.com/search/China+COVID-19/page/1/?orderby=relevance

任何帮助将不胜感激!

【问题讨论】:

  • 您很可能在代码中的其他位置使用整数值定义了requests
  • 添加到@Shreya 评论,如果您使用 python3.6+ f'{'Request:{attempts}; ,则必须将变量 request 更改为尝试并使用 f 字符串代替格式频率:{request/elapsed_time} request/s'}'
  • 真的!我在其他地方定义了请求;删除后,它可以工作

标签: python for-loop web-scraping beautifulsoup fetch


【解决方案1】:

对我来说,这段代码运行良好。我确实必须将request 放入您的函数中。确保不要将模块 requests 与变量 request 混淆。

from random import randint
from time import sleep, time
from bs4 import BeautifulSoup as bs


user_agent = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko'}

# controlling the crawl-rate
start_time = time() 

def scrape(url):
    request = 0
    urls = [f"{url}{x}" for x in range(0,10)]
    params = {
       "orderby": "relevance",
    }
    for page in urls:
        response = requests.get(url=page,
                                headers=user_agent,
                                params=params)   

        #pause the loop
        sleep(randint(8,15))

        #monitor the requests
        request += 1
        elapsed_time = time() - start_time
        print('Request:{}; Frequency: {} request/s'.format(request, request/elapsed_time))
#         clear_output(wait = True)

        #throw a warning for non-200 status codes
        if response.status_code != 200:
            warn('Request: {}; Status code: {}'.format(request, response.status_code))

        #Break the loop if the number of requests is greater than expected
        if request > 72:
            warn('Number of request was greater than expected.')
            break

        #parse the content
        soup_page = bs(response.text, 'lxml') 
        
print(scrape('https://nypost.com/search/China+COVID-19/page/'))

【讨论】:

  • 感谢您的帮助!我想知道有没有办法为网址添加一个字符串?我的目标是刮掉这个页面和以下 9 个页面nypost.com/search/China+COVID-19/page/1/?orderby=relevance
  • 我不确定你的意思。您仍然可以使用urls = [f"{url}{x}" for x in range(0,10)] 并将params 添加到您的requests.get() 作为request.get(url=page, headers=user_agent, params=params 其中params = {"orderby": "relevance"}
  • 抱歉不清楚!我的意思是我想抓取按相关性排序的页面,网址在我的最后一条评论中。我想你正确地理解了我。但是,您发布的调整后的代码不起作用!我在for page in urls: response = requests.get(url=page, headers=user_agent, params=params)之后打印了页面
  • 它给了我没有参数的页面(没有“?orderby =相关性”)。如果你能帮我解决它,我将不胜感激。
  • 这段代码对我有用。如果您打印response.url,您会看到已添加参数。
猜你喜欢
  • 1970-01-01
  • 2018-05-21
  • 1970-01-01
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多