[python] requests webpagina met symbolen in http

Pagina: 1
Acties:

Onderwerpen


  • nockelyk
  • Registratie: Juli 2007
  • Laatst online: 11-09-2023
Dag iedereen,

Ik probeer informatie op te halen via requests van deze link:
http://stockscreener.uk.r...%22}&OriginalCurrency=GBP
Het leek mij heel eenvoudig maar toch lijk ik er maar niet in te slagen.

Het is een link die gecreeerd wordt door een webformulier.
Ik kan die link zonder problemen plakken in firefox en krijg de gewenste pagina, met python lukt mij dit niet.

Ik heb momenteel dit:


import requests
from bs4 import BeautifulSoup

page=requests.post('http://http://stockscreener.uk.reuters.com/Stock/UK/ResultsTable?returnChoice=&page=2&sortBy=RCCMultexCompanyName&sortDir=A&quickscreen=gaarp&criteria=%5B%22StockUniverse%22%2C%22PriceEarnings%22%2C%22EPSGrowthRate%22%2C%22Region%22%2C%22SectorAndIndustry%22%2C%22PEGRatio%22%5D&Currency=GBP&PEGRatio={%22view%22%3A%22range%22%2C%22button_inputs%22%3A%5B%5D%2C%22range_inputs%22%3A%22%22}&SectorAndIndustry={%22industries%22%3A%5B%5D}&Region={%22countries%22%3A%5B%5D}&EPSGrowthRate={%22view%22%3A%22range%22%2C%22button_inputs%22%3A%5B%5D%2C%22range_inputs%22%3A%22%22}&PriceEarnings={%22view%22%3A%22range%22%2C%22button_inputs%22%3A%5B%5D%2C%22range_inputs%22%3A%22%22}&StockUniverse={%22button_inputs%22%3A%5B%22LIKE|United%2BKingdom%22%2C%22NOTLIKE|United%2BKingdom%22%5D}&criteriaSession={%22StockUniverse%22%3A{%22button_inputs%22%3A%5B%22LIKE|United%2BKingdom%22%2C%22NOTLIKE|United%2BKingdom%22%5D}%2C%22PriceEarnings%22%3A{%22view%22%3A%22range%22%2C%22button_inputs%22%3A%5B%5D%2C%22range_inputs%22%3A%22%22}%2C%22EPSGrowthRate%22%3A{%22view%22%3A%22range%22%2C%22button_inputs%22%3A%5B%5D%2C%22range_inputs%22%3A%22%22}%2C%22Region%22%3A{%22countries%22%3A%5B%5D}%2C%22SectorAndIndustry%22%3A{%22industries%22%3A%5B%5D}%2C%22PEGRatio%22%3A{%22view%22%3A%22range%22%2C%22button_inputs%22%3A%5B%5D%2C%22range_inputs%22%3A%22%22}%2C%22Currency%22%3A%22GBP%22}&OriginalCurrency=GBP')

soup=BeautifulSoup(page.text)
print(soup)


Mijn programma doet alles correct (geen foutmeldingen) maar ik kom op een verkeerde pagina terecht (website die zegt dat de pagina niet kon gevonden worden).

Ik heb gemerkt dat er een verschil is tussen de link die ik zie in firefox en de link die ik uiteindelijk plak in python. Blijkbaar worden een aantal karakters vervangen (zoals bv: [ ] " ).
Ik heb deze ook al proberen te vervangen en zo de html door te sturen maar dat lijkt ook niet te helpen.


import requests
from bs4 import BeautifulSoup

page=requests.post('http://stockscreener.uk.reuters.com/Stock/UK/ResultsTable?returnChoice=&page=100&sortBy=RCCMultexCompanyName&sortDir=A&quickscreen=gaarp&criteria=["StockUniverse"%2C"PriceEarnings"%2C"EPSGrowthRate"%2C"Region"%2C"SectorAndIndustry"%2C"PEGRatio"]&Currency=GBP&PEGRatio={"view"%3A"range"%2C"button_inputs"%3A[]%2C"range_inputs"%3A""}&SectorAndIndustry={"industries"%3A[]}&Region={"countries"%3A[]}&EPSGrowthRate={"view"%3A"range"%2C"button_inputs"%3A[]%2C"range_inputs"%3A""}&PriceEarnings={"view"%3A"range"%2C"button_inputs"%3A[]%2C"range_inputs"%3A""}&StockUniverse={"button_inputs"%3A["LIKE|United%2BKingdom"%2C"NOTLIKE|United%2BKingdom"]}&criteriaSession={"StockUniverse"%3A{"button_inputs"%3A["LIKE|United%2BKingdom"%2C"NOTLIKE|United%2BKingdom"]}%2C"PriceEarnings"%3A{"view"%3A"range"%2C"button_inputs"%3A[]%2C"range_inputs"%3A""}%2C"EPSGrowthRate"%3A{"view"%3A"range"%2C"button_inputs"%3A[]%2C"range_inputs"%3A""}%2C"Region"%3A{"countries"%3A[]}%2C"SectorAndIndustry"%3A{"industries"%3A[]}%2C"PEGRatio"%3A{"view"%3A"range"%2C"button_inputs"%3A[]%2C"range_inputs"%3A""}%2C"Currency"%3A"GBP"}&OriginalCurrency=GBP')

soup=BeautifulSoup(page.text)
print(soup)





Iemand een idee?

  • Tk55
  • Registratie: April 2009
  • Niet online
Er zijn een paar dingen waar je naar zou kunnen kijken:

1. Bijvoorbeeld: De pagina van het formulier geeft je een ID, soms heb je die nodig in je post request. Deze verandert elke keer, soort blokkade tegen spam.

2. Je post data moet je in requests in een dictionary zetten. Zie hier: http://docs.python-reques...complicated-post-requests

3. Je zou ook nog het proces van de pagina openen kunnen volgen. Dus page.response en page.url checken.

Typ dit vanaf mijn telefoon dus ik kan niet echt voor je testen...

  • nockelyk
  • Registratie: Juli 2007
  • Laatst online: 11-09-2023
bedankt voor je reactie!

De laatste 2 stappen heb ik eigenlijk vroeger al geprobeerd.
Ik zat toen met het probleem dat ik niet meer door de resultatenpagina's kon gaan.
Als ik bijvoorbeeld pagina 1 (page="1") of pagina 100 (page="100") opvroeg krijg ik steeds de resultaten van pagina 1.
Ik dacht daarom dat ik het misschien kon oplossen via het versturen van html met de info in.

Dit was mijn code:




import requests
from bs4 import BeautifulSoup

url='http://stockscreener.uk.reuters.com/Stock/UK/Results'
returnchoice=""
page="3697"
sortby="RCCMultexCompanyName"
sortdir="A"
quickscreen="gaarp"
criteria='["StockUniverse","PriceEarnings","EPSGrowthRate","Region","SectorAndIndustry","PEGRatio"]'
currency='GBP'
pegratio='{"view":"range","button_inputs":[],"range_inputs":""}'
sectorandindustry='{"industries":[]}'
region='{"countries":[]}'
epsgrowthrate='{"view":"range","button_inputs":[],"range_inputs":""}'
priceearnings='{"view":"range","button_inputs":[],"range_inputs":""}'
stockuniverse='{"button_inputs":["LIKE|United+Kingdom","NOTLIKE|United+Kingdom"]}'
criteriasession='{"StockUniverse":{"button_inputs":["LIKE|United+Kingdom","NOTLIKE|United+Kingdom"]},"PriceEarnings":{"view":"range","button_inputs":[],"range_inputs":""},"EPSGrowthRate":{"view":"range","button_inputs":[],"range_inputs":""},"Region":{"countries":[]},"SectorAndIndustry":{"industries":[]},"PEGRatio":{"view":"range","button_inputs":[],"range_inputs":""},"Currency":"GBP"}'
originalcurrency=''


input_data={'returnChoice':returnchoice,'page':page, 'sortBy':sortby, 'sortDir':sortdir, 'quickscreen':quickscreen,'criteria':criteria,'Currency':currency,'PEGRatio':pegratio,'SectorAndIndustry':sectorandindustry,'Region':region,'EPSGrowthRate':epsgrowthrate,'PriceEarnings':priceearnings,'StockUniverse':stockuniverse,'criteriaSession':criteriasession, 'OriginalCurrency':originalcurrency}

page=requests.get(url, data=dict(input_data))

soup=BeautifulSoup(page.text)

print(soup)



  • Tk55
  • Registratie: April 2009
  • Niet online
Ik heb nog even gekeken, maar het lijkt erop dat de eerste pagina aan de hand van de POST bepaalt wordt, en dat alle pagina's na de eerste via een GET worden binnengehaald. Misschien dat je dit in zou moeten programmeren, al is het wat omslachtig.

  • nockelyk
  • Registratie: Juli 2007
  • Laatst online: 11-09-2023
ik ben er nog steeds mee bezig maar niet echt vooruitgang geboekt.
Het lukt me wel om de gegevens te krijgen zonder die POST, dus met een GET.
Ik krijg dan gewoon de informatie van het eerste blad.
Als ik het paginanummer verander blijf ik echter de resultaten van het eerste blad ontvangen.

Dit heb ik momenteel:

import requests
from bs4 import BeautifulSoup

url2='http://stockscreener.uk.reuters.com/Stock/UK/ResultsTable?returnChoice=&page=100&sortBy=RCCMultexCompanyName&sortDir=A&quickscreen=gaarp&criteria=["StockUniverse"%2C"PriceEarnings"%2C"EPSGrowthRate"%2C"Region"%2C"SectorAndIndustry"%2C"PEGRatio"]&Currency=GBP&PEGRatio={"view"%3A"range"%2C"button_inputs"%3A[]%2C"range_inputs"%3A""}&SectorAndIndustry={"industries"%3A[]}&Region={"countries"%3A[]}&EPSGrowthRate={"view"%3A"range"%2C"button_inputs"%3A[]%2C"range_inputs"%3A""}&PriceEarnings={"view"%3A"range"%2C"button_inputs"%3A[]%2C"range_inputs"%3A""}&StockUniverse={"button_inputs"%3A["LIKE|United%2BKingdom"%2C"NOTLIKE|United%2BKingdom"]}&criteriaSession={"StockUniverse"%3A{"button_inputs"%3A["LIKE|United%2BKingdom"%2C"NOTLIKE|United%2BKingdom"]}%2C"PriceEarnings"%3A{"view"%3A"range"%2C"button_inputs"%3A[]%2C"range_inputs"%3A""}%2C"EPSGrowthRate"%3A{"view"%3A"range"%2C"button_inputs"%3A[]%2C"range_inputs"%3A""}%2C"Region"%3A{"countries"%3A[]}%2C"SectorAndIndustry"%3A{"industries"%3A[]}%2C"PEGRatio"%3A{"view"%3A"range"%2C"button_inputs"%3A[]%2C"range_inputs"%3A""}%2C"Currency"%3A"GBP"}&OriginalCurrency=GBP'
url='http://stockscreener.uk.reuters.com/Stock/UK/Results'
returnchoice=""
page="1"
sortby="RCCMultexCompanyName"
sortdir="A"
quickscreen="gaarp"
criteria='["StockUniverse","PriceEarnings","EPSGrowthRate","Region","SectorAndIndustry","PEGRatio"]'
currency='GBP'
pegratio='{"view":"range","button_inputs":[],"range_inputs":""}'
sectorandindustry='{"industries":[]}'
region='{"countries":[]}'
epsgrowthrate='{"view":"range","button_inputs":[],"range_inputs":""}'
priceearnings='{"view":"range","button_inputs":[],"range_inputs":""}'
stockuniverse='{"button_inputs":["LIKE|United+Kingdom","NOTLIKE|United+Kingdom"]}'
criteriasession='{"StockUniverse":{"button_inputs":["LIKE|United+Kingdom","NOTLIKE|United+Kingdom"]},"PriceEarnings":{"view":"range","button_inputs":[],"range_inputs":""},"EPSGrowthRate":{"view":"range","button_inputs":[],"range_inputs":""},"Region":{"countries":[]},"SectorAndIndustry":{"industries":[]},"PEGRatio":{"view":"range","button_inputs":[],"range_inputs":""},"Currency":"GBP"}'
originalcurrency='GBP'


input_data={'returnChoice':returnchoice,'page':page, 'sortBy':sortby, 'sortDir':sortdir, 'quickscreen':quickscreen,'criteria':criteria,'Currency':currency,'PEGRatio':pegratio,'SectorAndIndustry':sectorandindustry,'Region':region,'EPSGrowthRate':epsgrowthrate,'PriceEarnings':priceearnings,'StockUniverse':stockuniverse,'criteriaSession':criteriasession, 'OriginalCurrency':originalcurrency}

page0=requests.post(url, data=dict(input_data))

soup=BeautifulSoup(page1.text)


ticker_list=[]
for link in soup.find_all('a'):
a=(link.get('href'))
if "quotes/overview?symbol" in a:
ticker=a.replace('http://uk.reuters.com/business/quotes/overview?symbol=', '')
ticker_list.append(ticker)
print(ticker_list)


  • Naranya
  • Registratie: Oktober 2010
  • Laatst online: 17:27
De eerste request is inderdaad een post, de volgende requests zijn get's.
Onderstaande code geeft bij mij de results tabel terug.
De server verwacht iig een 'CriteriaSession' cookie anders krijg je een 500.

Er zijn natuurlijk genoeg API's die wel makkelijk te benaderen zijn ;)

Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import urllib
import requests
from bs4 import BeautifulSoup

url = "http://stockscreener.uk.reuters.com/Stock/UK/ResultsTable"
headers = {"content-type": "application/x-www-form-urlencoded"}
data = {
    "returnChoice": "",
    "page": 1,
    "sortBy": "RCCMultexCompanyName",
    "sortDir": "A",
    "quickscreen": "gaarp",
    "criteria": [
        "StockUniverse",
        "PriceEarnings",
        "EPSGrowthRate",
        "Region",
        "SectorAndIndustry",
        "PEGRatio"
    ],
    "Currency": "GBP",
    "PEGRatio": {
        "view": "range",
        "button_inputs": [],
        "range_inputs": "LSS|1"
    },
    "SectorAndIndustry": {
        "industries": []
    },
    "Region": {
        "countries": [
            "GB"
        ]
    },
    "EPSGrowthRate": {
        "view": "range",
        "button_inputs": [],
        "range_inputs": "GTR|15"
    },
    "PriceEarnings": {
        "view": "range",
        "button_inputs": [],
        "range_inputs": "GEQ|0|LEQ|15"
    },
    "StockUniverse": {
        "button_inputs": [
            "LIKE|United+Kingdom",
            "NOTLIKE|United+Kingdom"
        ]
    },
    "criteriaSession": {
        "StockUniverse": {
            "button_inputs": [
                "LIKE|United+Kingdom",
                "NOTLIKE|United+Kingdom"
            ]
        },
        "PriceEarnings": {
            "view": "range",
            "button_inputs": [],
            "range_inputs": "GEQ|0|LEQ|15"
        },
        "EPSGrowthRate": {
            "view": "range",
            "button_inputs": [],
            "range_inputs": "GTR|15"
        },
        "Region": {
            "countries": [
                "GB"
            ]
        },
        "SectorAndIndustry": {
            "industries": []
        },
        "PEGRatio": {
            "view": "range",
            "button_inputs": [],
            "range_inputs": "LSS|1"
        },
        "Currency": "GBP"
    },
    "OriginalCurrency": ""
}

cookies = {
    'CriteriaSession': ''
}

r = requests.get(url, params=urllib.urlencode(data), headers=headers, cookies=cookies)
soup = BeautifulSoup(r.text)

with open('output.html', 'w') as f:
    f.write(str(soup))

  • nockelyk
  • Registratie: Juli 2007
  • Laatst online: 11-09-2023
Bedankt!!!
Het werkt perfect.

Eerlijkheidshalve zijn er een aantal zaken die ik niet begrijp aan je code maar die zal ik morgen eens rustig bestuderen ;-)
Pagina: 1