scrapy 为什么我在剧作家里得不到饼干价值?

m3eecexj  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(143)

首先,为我糟糕的英语道歉
我想用剧作家来得到饼干,但我不能。我试了三种方法,我发现,但没有得到。
1.使用page.on

page.on('request',get_cookie)
page.on('response',get_cookie)

def get_cookie(request):
    allheaders = request.all_headers()
    print(allheaders)

>>>
{'accept-ranges': 'bytes', 'age': '9576', 'cache-control': 'max-age=600', 'content-length': '6745', 'content-type': 'image/png', 'date': 'Thu, 30 Jun 2022 01:09:20 GMT', 'etag': '"206578bcab2ad71:0"', 'expires': 'Thu, 30 Jun 2022 01:19:20 GMT', 'last-modified': 'Tue, 06 Apr 2021 06:11:52 GMT', 'server': 'NWS_SPMid', 'x-cache-lookup': 'Cache Hit', 'x-daa-tunnel': 'hop_count=1', 'x-nws-log-uuid': '16892018456232999193', 'x-powered-by': 'ASP.NET'}
{'accept-ranges': 'bytes', 'age': '9576', 'cache-control': 'max-age=600', 'content-length': '6745', 'content-type': 'image/png', 'date': 'Thu, 30 Jun 2022 01:09:20 GMT', 'etag': '"206578bcab2ad71:0"', 'expires': 'Thu, 30 Jun 2022 01:19:20 GMT', 'last-modified': 'Tue, 06 Apr 2021 06:11:52 GMT', 'server': 'NWS_SPMid', 'x-cache-lookup': 'Cache Hit', 'x-daa-tunnel': 'hop_count=1', 'x-nws-log-uuid': '16892018456232999193', 'x-powered-by': 'ASP.NET'}
...(and more like this)

返回了一些东西,但这里没有cookie
1.将browser_context.cookies解析后的!Thx用于@Charchit

context = browser.new_context();
page = context.new_page()
page.goto(url)
cookies = context.cookies
print(cookies)

>>>
<bound method BrowserContext.cookies of <BrowserContext browser=<Browser type=<BrowserType name=chromium executable_path=/Users/swong/Library/Caches/ms-playwright/chromium-1005/chrome-mac/Chromium.app/Contents/MacOS/Chromium> version=102.0.5005.40>>>

1.使用JS

cookie = page.evaluate('console.log(document.cookie)')
print(cookie)

>>>
None

我从Chromium页面打开了网络选项卡,在Requests的头中有我想要的cookie。
请帮帮我,谢谢大家!
这是我的代码示例。网站是中文的,希望你不要介意。这只是一个简单的登录页面。

from playwright.sync_api import sync_playwright

url = 'https://so.gushiwen.cn/user/login.aspx'

def get_cookie(request_or_reqponse):
    headersArray = request_or_reqponse.headers_array()
    print('「headersArray」:', headersArray)

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    context = browser.new_context();
    page = context.new_page()

    page.goto(url)
    page.fill('#email','6j3y4ecy@spymail.one')
    page.fill('#pwd', '6j3y4ecy@spymail.one')

    page.wait_for_timeout(5000) # imput the captcha code manually

    page.on('request',get_cookie)
    page.on('response',get_cookie)

    print('loging in...')
    page.click('#denglu')

    page.wait_for_timeout(50000) # wait for nothing

    browser.close()
luaexgnf

luaexgnf1#

在第二个方法中,将cookies = context.cookies更改为cookies = context.cookies()。这是一个方法,您需要调用它。请查看文档:

context = browser.new_context();
page = context.new_page()
page.goto(url)
cookies = context.cookies()
print(cookies)

另外,像第一个方法那样做也是不可取的。这是因为即使你从响应中得到了Cookie头,你也不能在其他地方存储和使用它,除非你使用一个工厂函数或一个全局变量。此外,当BrowserContext有一个专门的方法时,为什么要这样做呢:)

编辑

第一种方法看起来不起作用的原因是它返回了请求和响应的标题。Cookie也可以通过页面本身的javascript创建,这些可能根本不会显示在标题中。
第二,从你为问题中的第一个方法打印出的头文件来看,它似乎只是针对一个请求。运行你的代码后,收到了更多的请求和响应,这就打印出了更多的头文件。特别是从响应中,你可以通过搜索头文件'set-cookie'来检索服务器设置的cookie。

相关问题