【发布时间】: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