【问题标题】:Why do a request work on requests but not on scrapy为什么请求适用于请求而不适用于scrapy
【发布时间】:2021-01-21 14:34:57
【问题描述】:

我正在尝试抓取一个webpage,它会在我滚动时加载第 2 页的结果,依此类推。所以我得到了它运行的 api (img) 的 url,它应该可以正常工作。

但它只有在我使用 requests 库时才有效。当我使用与 scrapy 相同的 url 运行 requests.get() 时,我得到响应 200,但使用 scrapy 它返回 500 状态。我不知道为什么这不适用于scrapy,对此有何解释?

这就是我想要做的事情

Obrigado。

import scrapy
import json
import re

class ScrapeVagas(scrapy.Spider):
    name = "vagas"
    base_url = "https://www.trabalhabrasil.com.br/api/v1.0/Job/List?idFuncao=0&idCidade=5345&pagina=%d&pesquisa=&ordenacao=1&idUsuario="
    start_urls = [base_url % 100]
    download_delay = 1

    def parse(self, response):
        vagas = json.loads(response.text)
        
        for vaga in range(0, len(vagas)):
            yield {
                "vaga": vagas[vaga]["df"],
                "salario": re.sub("[R\$.]", "", vagas[vaga]["sl"]).strip()
            }

【问题讨论】:

  • 您可以使用像 Wireshark 这样的网络嗅探器来比较请求。可能他们使用不同的标题。
  • {'vaga': 'Consultor de Vendas', 'salario': '4000,00', 'files': []},我得到了这个结果。
  • @SamsulIslam 哈哈,怎么样?在这里,它仅在从请求中使用“get”或在scrapy之前仍然有效。这是我从scrapy得到的:i.imgur.com/NrDAhb5.png

标签: web-scraping python-requests scrapy


【解决方案1】:

您收到500 Internal Server Error 服务器错误响应代码表明服务器遇到了阻止它完成请求的意外情况。 这里需要请求标头来获得正确的响应。查看 scrapy shell 中的输出。

import scrapy
base_url = "https://www.trabalhabrasil.com.br/api/v1.0/Job/List?idFuncao=0&idCidade=5345&pagina=%d&pesquisa=&o
rdenacao=1&idUsuario="
start_urls = [base_url % 100]
start_urls
url = start_urls[0]
headers = {"USER-AGENT":"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.3",
                 "referer": "https://www.trabalhabrasil.com.br/vagas-empregos-em-sao-paulo-sp",
                  "authority": "www.trabalhabrasil.com.br",
                 "path": "/api/v1.0/Job/List?idFuncao=100&idCidade=5345&pagina=65&pesquisa=&ordenacao=1&idUsuario=",
       
                "scheme": "https",
                 "accept": "*/*",
               "accept-language": "en-US,en;q=0.9,bn;q=0.8",
      
               "dnt": "1",
                 "sec-fetch-dest": "empty",
                "sec-fetch-mode": "cors",
                   "sec-fetch-site": "same-origin",
      
                }
     
r = scrapy.Request(url, headers=headers)
fetch(r)
2021-01-22 00:30:13 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.trabalhabrasil.com.br/api/v1.0/Job/List?idFuncao=0&idCidade=5345&pagina=100&pesquisa=&ordenacao=1&idUsuario=> (referer: https://www.trabalhabrasil.com.br/vagas-empregos-em-sao-paulo-sp)
    
    
In [19]: response.status
Out[19]: 200

【讨论】:

  • 感谢@SamsulIslam,不知道。欣赏它。
  • 请点赞或接受此/任何对您有用的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-11
  • 2018-06-08
  • 1970-01-01
  • 2018-06-19
  • 2016-12-16
  • 2020-11-23
  • 2019-07-03
相关资源
最近更新 更多