如何用scrapy提交表格?

2024-03-29 14:00:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用scrapy完成登录并收集我的项目提交计数。这是代码

from scrapy.item import Item, Field
from scrapy.http import FormRequest
from scrapy.spider import Spider
from scrapy.utils.response import open_in_browser


class GitSpider(Spider):
    name = "github"
    allowed_domains = ["github.com"]
    start_urls = ["https://www.github.com/login"]

    def parse(self, response):
        formdata = {'login': 'username',
                'password': 'password' }
        yield FormRequest.from_response(response,
                                        formdata=formdata,
                                        clickdata={'name': 'commit'},
                                        callback=self.parse1)

    def parse1(self, response):
        open_in_browser(response)

在运行代码之后

scrapy runspider github.py

它应该向我显示表单的结果页,这应该是一个失败的登录在同一页的用户名和密码是假的。然而,它向我展示了search page。日志文件位于pastebin

代码应该如何修复?提前谢谢


Tags: 代码nameinfromimportselfbrowsergithub
3条回答

使用webdriver的解决方案

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
from scrapy.contrib.spiders import CrawlSpider

class GitSpider(CrawlSpider):

    name = "gitscrape"
    allowed_domains = ["github.com"]
    start_urls = ["https://www.github.com/login"]

    def __init__(self):
        self.driver = webdriver.Firefox()

    def parse(self, response):
        self.driver.get(response.url)
        login_form = self.driver.find_element_by_name('login')
        password_form = self.driver.find_element_by_name('password')
        commit = self.driver.find_element_by_name('commit')
        login_form.send_keys("yourlogin")
        password_form.send_keys("yourpassword")
        actions = ActionChains(self.driver)
        actions.click(commit)
        actions.perform()
        # by this point you are logged to github and have access 
        #to all data in the main menù
        time.sleep(3)
        self.driver.close()

你的问题是FormRequest.from_response()使用了一种不同的形式——“搜索形式”。但是,您希望它使用“登录表单”。提供一个formnumber参数:

yield FormRequest.from_response(response,
                                formnumber=1,
                                formdata=formdata,
                                clickdata={'name': 'commit'},
                                callback=self.parse1)

以下是应用更改后在浏览器中打开的内容(使用“假”用户):

enter image description here

使用“formname”参数也可以:

yield FormRequest.from_response(response,
                            formname='Login',
                            formdata=formdata,
                            clickdata={'name': 'commit'},
                            callback=self.parse1)

相关问题 更多 >