尝试从 BGG 中抓取项目的数据,但在第 20 页之后,您需要登录。我正在遵循本指南,并查看了其他一些使用 Scrapy 的人,但这是在他们实现特定页面的登录之前。我似乎不知道如何让 Scrapy 的请求功能发挥作用。
我正在尝试在Spider( https://docs.scrapy.org/en/latest/topics/request-response.html )中使用Scrapy的[Requests and FormRequest.from_response],如下所示:
class BGGSpider(Spider):
name = "bgg"
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:48.0) Gecko/20100101 Firefox/48.0'}
def start_requests(self):
yield scrapy.Request(
url='https://boardgamegeek.com/login/',
callback=self.login
)
def login(self, response):
return scrapy.FormRequest.from_response(
response,
formdata = {
'username': 'myname',
'password': 'mypassword',
},
callback=self.parse
)
def parse(self, response):
url = "https://www.boardgamegeek.com/browse/boardgame/page/"
for index in range(1):
yield Request(url=url+str(index+1), callback=self.parse_deeper, headers=self.headers, dont_filter=True)
Run Code Online (Sandbox Code Playgroud)
它返回“ raise ValueError(f“在 {response} 中找不到元素”) ValueError:在 <200 https://boardgamegeek.com:443/login> 中找不到元素”
但我检查了登录门户,看起来有一个表单,但我不知道如何获取专门访问它的请求,也不知道为什么找不到它作为表单(也许嵌入了 JavaScript?)。帮助将不胜感激,预先感谢您!
你是对的,页面https://boardgamegeek.com/login/没有登录表单,真正的表单是通过 javascript 加载的,你可以inspect在 chrome 浏览器上使用它看到网站的流量,这确实有帮助我在https://bitmaker.la上的工作
您必须发布登录信息的真实网址是https://boardgamegeek.com/login/api/v1,您将收到一个204状态,然后您可以转到https://boardgamegeek.com/?rnd=0mcmt并开始抓取
这是蜘蛛版本的解释:
import scrapy
from scrapy import Spider, Request
import json
class BGGSpider(Spider):
name = "bgg"
def start_requests(self):
yield scrapy.Request(
url='https://boardgamegeek.com/login/',
callback=self.login
)
def login(self, response):
yield scrapy.Request(
url='https://boardgamegeek.com/login/api/v1',
method="POST",
callback=self.parse,
dont_filter = True,
body=json.dumps({"credentials": {"username": "username", "password": "password"}}),
headers={
'authority': 'boardgamegeek.com',
'content-type': 'application/json',
'origin': 'https://boardgamegeek.com',
'referer': 'https://boardgamegeek.com/login',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
}
)
def parse(self, response):
url = "https://boardgamegeek.com/?rnd=0mcmt"
yield Request(url=url, callback=self.parse_deeper)
def parse_deeper(self, response):
print("we passed the login")
Run Code Online (Sandbox Code Playgroud)
顺便说一句,这些headers很重要
| 归档时间: |
|
| 查看次数: |
174 次 |
| 最近记录: |