【发布时间】:2022-01-25 01:53:52
【问题描述】:
我正在从股票筛选器中抓取数据。我可以使用 get_screener('111&r=1') 获得前 20 个结果的第一页。下一页将是 get_screener('111&r=21') 以获取接下来的 20 个结果。我尝试添加额外的获取请求,但它给了我错误,所以我不知道如何编码,所以它会给我额外的行。有谁知道这是怎么做的吗?
谢谢
import requests
import pandas as pd
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'}
def get_screener(version):
screen = requests.get(f'https://finviz.com/screener.ashx?v={version}&f=all', headers = headers).text
tables = pd.read_html(screen)
tables = tables[-2]
tables.columns = tables.iloc[0]
tables = tables[1:]
return tables
tables111 = get_screener('111&r=1')
tables161 = get_screener('161&r=1')
tables121 = get_screener('121&r=1')
consolidatedtables = pd.merge(tables111,tables161,how='outer',left_on='Ticker',right_on='Ticker')
consolidatedtables = pd.merge(consolidatedtables,tables121,how='outer',left_on='Ticker',right_on='Ticker')
consolidatedtables.to_csv('test.csv')
print(consolidatedtables)
我正在使用的新代码
import pandas as pd
import requests
import bs4
import time
import random
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'}
def get_screener(version):
url = 'https://finviz.com/screener.ashx?v={version}&r={page}&f=all'
page = 1
screen = requests.get(url.format(version=version, page=page), headers=headers)
soup = bs4.BeautifulSoup(screen.text, features='lxml')
pages = int(soup.find_all('a', {'class': 'screener-pages'})[-1].text)
data = []
for page in range(1, 20 * pages, 20):
print(version, page)
screen = requests.get(url.format(version=version, page=page), headers=headers).text
tables = pd.read_html(screen)
tables = tables[-2]
tables.columns = tables.iloc[0]
tables = tables[1:]
data.append(tables)
time.sleep(random.random())
return pd.concat(data).reset_index(drop=True).rename_axis(columns=None)
df = get_screener('111')
df.info()
Output
111 1
111 21
111 41
111 61
111 81
111 101
111 121
111 141
111 161
111 181
111 201
111 221
111 241
111 8321
111 8341
111 8361
111 8381
111 8401
111 8421
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 8439 entries, 0 to 8438
Data columns (total 11 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 No. 8439 non-null object
1 Ticker 8439 non-null object
2 Company 8439 non-null object
3 Sector 8439 non-null object
4 Industry 8439 non-null object
5 Country 8439 non-null object
6 Market Cap 8439 non-null object
7 P/E 8439 non-null object
8 Price 8439 non-null object
9 Change 8439 non-null object
10 Volume 8439 non-null object
dtypes: object(11)
memory usage: 725.4+ KB
【问题讨论】:
-
我尝试了
'111&r61'和其他页面,效果很好。你有什么问题? -
我的问题是我只能得到 20 个结果。 111&r61d 给出第 61-80 行。我想要所有可能在 8,000 左右的行。
-
用
range(1, N, 20)做一个循环 -
这里几乎是个新手,有循环,所以不知道如何实现它。不过谢谢