使用scrapy和pyquery登录到Stackoverflow,但无法进行进一步的剪贴

问题描述

我目前正在使用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登录页面

解决方法

似乎您正在使用Requests库进行最终的POST请求。从requests.post()返回的响应将以多种方式使响应的主体可用。请参阅:https://requests.readthedocs.io/en/master/user/quickstart/#response-content。您应该通过response.status_code检查响应代码的2XX值。这样做的快捷方式是仅检查response.ok。完成后,您可以将响应正文作为文本获取:

response.text

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

如果返回JSON,则可以通过以下方式从JSON扩展结果数据结构:

response.json

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...