【问题标题】:Not able to acquire sessionid using urllib for screener.in无法使用 screener.in 的 urllib 获取 sessionid
【发布时间】:2020-01-09 22:29:35
【问题描述】:

我是 Python 的新手。我正在尝试在 Python3.6 中编写一个脚本,该脚本将在 screener.in 网站上搜索一些股票值,例如 PEG 比率。

问题是我只有在登录 screener.in 后才能获得 PEG 比率。我的 python 脚本登录到筛选器,但在登录到筛选器后,CookieJar 应该包含 csrftoken 和 sessionid,但 CookieJar 只包含 csrftoken。登录 screener.in 后,网站重定向到页面https://www.screener.in/dash/。在 HTTPRedirectHandler 中的此重定向期间,我可以看到 hds 参数中存在 sessionid。但是如何将它添加到 CookieJar 中,即使我将其添加如下

c = http.cookiejar.Cookie(version=0, name="sessionid", value=val, port=None, port_specified=False, domain="www.screener.in", domain_specified=True, domain_initial_dot=False , path='/', path_specified=True, 安全=真,过期='1552204782',丢弃=假,评论=无,评论网址=无,休息=无) self.jar.set_cookie(c)

CookieJar 在通话期间重置以获取公司的 PEG 配给(在脚本中我试图获取 bharat rasayan 的比率(https://www.screener.in/company/BHARATRAS/)。下面是我的脚本


from bs4 import BeautifulSoup
import urllib
import http.cookiejar
from datetime import datetime
from calendar import timegm




class HTTPRedirectHandler(urllib.request.HTTPRedirectHandler):
    def __init__(self, jar):
        self.jar = jar

    def redirect_request(self, req, fp, code, msg, hds, newurl):

        sessionid = ''
        for i in hds._headers:
            if i[0] != 'Set-Cookie':
                continue
            if i[1].startswith('sessionid='):
                sessionid = i[1]
                print("In redirect_request(): SessionId found value is: " + sessionid + "\n\n")
                break

        newreq = super().redirect_request(
            req, fp, code, msg, hds, newurl)


        return newreq



def get_url(url, data=None, timeout=30, opener=None, requestHeader = None, jar = None):
  '''get_url accepts a URL string and return the server response code, response headers, and contents of the file'''

  req_headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
  }

  if requestHeader:
      req_headers.update(requestHeader)

  request = urllib.request.Request(url, headers=req_headers, data=data)
  if not opener:
    jar = http.cookiejar.CookieJar()
    redirectHandler = HTTPRedirectHandler(jar)


    opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(jar), redirectHandler)


  while 1:
    try:
        response = opener.open(request)
    except Exception as inst:
        print(type(inst))
        print(inst.args)
        print(inst)

    break

  jar.extract_cookies(response, request)
  print("In get_url(): ")
  print(jar.make_cookies(response, request))

  code = response.code
  headers = response.headers
  html = response.read()
  return code, headers, html, opener, jar



code, headers, html, cur_opener, jar = get_url('https://www.screener.in/login/', timeout=3)

#responceHeaders = headers['Set-Cookie']
#responceHeaders = responceHeaders[responceHeaders.find('=') + 1:responceHeaders.find(';')]
#print(responceHeaders)
#print(headers)

soup = BeautifulSoup(html, 'html.parser')
fdata = soup.find_all('input', {'name': "csrfmiddlewaretoken"})
csrfMiddlewareToken = str(fdata[0])
csrfMiddlewareToken = csrfMiddlewareToken[csrfMiddlewareToken.find('value="') + len('value="') : csrfMiddlewareToken.find('>') -1]
print("The value of csrfMiddlewareToken is: " + csrfMiddlewareToken + "\n\n")
requestHeaderL ={ 'referer' : 'https://www.screener.in/login/', 'origin' : 'https://www.screener.in', 'Connection' : "keep-alive", 'sec-fetch-mode': 'navigate', 'sec-fetch-site': 'same-origin', 'sec-fetch-user': '?1'}

login_data = urllib.parse.urlencode({ 'csrfmiddlewaretoken' : csrfMiddlewareToken, 'next': '', 'username' : "screenerintest@gmail.com", 'password' : "91@Screener", 'action' : 'login'}).encode('UTF-8') 
code, headers, html, cur_opener, jar = get_url('https://www.screener.in/login/', data=login_data, timeout=3, opener= cur_opener, requestHeader=requestHeaderL, jar=jar)
print("The value of respond headers is: ")
print(headers)

code, headers, html, cur_opener, jar = get_url('https://www.screener.in/company/BHARATRAS/',timeout=3, opener= cur_opener, requestHeader=requestHeaderL, jar= jar)
soup= BeautifulSoup(html,'html.parser')
fdata = soup.find_all('li')


for i in fdata:
    strVal = i.get_text().replace('\n','').strip()
    val = strVal[0:strVal.find(':')].strip()
    if val != 'PEG Ratio':
        continue
    else:
        print('\nPEG Ratio found\n')
        break;
else:
    print('\nPEG Ratio not found')

screener.in 在登录前为 bharat rasayan 返回的值

市值:2,031 铬。当前价格:4,778 52 周高/低 7939.95 / 3325.00 账面价值:961.91 股票市盈率:15.61 股息收益率:0.03 % ROCE:39.06 % ROE:38.86 % 销售增长(3 年):21.87 % 在 BSE 和 NSE 公司网站上上市面值:10.00

登录后

市值:2,031 铬。当前价格:4,778 52 周高/低 7939.95 / 3325.00 账面价值:961.91 股票市盈率:15.61 股息收益率:0.03 % ROCE:39.06 % ROE:38.86 % 销售增长(3 年):21.87 % 在 BSE 和 NSE 公司网站上上市面值:10.00 PEG比率:0.27

注意:登录后显示PEG比率。

在此问题上的任何帮助将不胜感激

谢谢。

【问题讨论】:

    标签: python session-cookies urllib http-redirect


    【解决方案1】:

    好的,我想通了。实际上我需要保存 sessionid 并将其作为标题传递。 另外,我没有得到 PEG 比率,因为我需要对 api/company/758/quick_ratios/ 进行 API 调用

    谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-02
      • 2019-11-26
      • 1970-01-01
      • 2019-04-05
      • 2020-08-23
      • 1970-01-01
      相关资源
      最近更新 更多