1

我目前正在学习使用scrapy进行网络抓取,并尝试/学习各种方法来登录stackoverflow,然后提取一些问题来练习网络抓取。我已经使用以下代码使用scrapy和pyquery成功登录到stackoverflow:

import scrapy
import requests
import getpass
from pyquery import PyQuery
from scrapy import FormRequest
from scrapy.utils.response import open_in_browser


class QuoteSpider(scrapy.Spider):
    name = 'stackoverflow'
    start_urls = ['https://stackoverflow.com/users/login']
    
    # def login_page(self):
    # Fetch the fkey
    login_page = requests.get(start_urls[0]).text
    pq = PyQuery(login_page)
    fkey = pq('input[name="fkey"]').val()

    # Prompt for email and password
    email = input("Email: ")
    password = getpass.getpass()

    # Login
    response = requests.post(
        start_urls[0],
        data = {
            'email': email,
            'password': password,
            'fkey': fkey
        })
    print(response)

    def parse(self, response):
        open_in_browser(response)
        
    def get_questions_link(self):
        pass

但作为回应,它只给我成功状态代码,即 200,使用以下命令运行:

scrapy crawl stackoverflow -L WARN
Email: test@gmail.com
Password: 
<Response [200]>

那么,我怎样才能得到整个 html 页面数据的响应,以便我可以抓取更多的问题/数据。解析功能也在工作,但它只是打开 stackoverflow 登录页面。

4

1 回答 1

0

看起来您正在使用 Requests 库来处理您发出的最终 POST 请求。返回的响应requests.post()将使响应的主体以多种方式可用。请参阅:https ://requests.readthedocs.io/en/master/user/quickstart/#response-content 。您应该通过 . 检查 2XX 值的响应代码response.status_code。一个捷径就是检查response.ok. 完成此操作后,您可以将响应正文作为文本获取:

response.text

如果您希望网页 (HTML) 回来,这就是您想要的。

如果您返回 JSON,您可以通过以下方式获得从该 JSON 扩展的结果数据结构:

response.json

如果您不确定会返回什么,请检查Content-Type标头值。

于 2020-10-13T03:18:17.987 回答