Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 付费墙后的网络强奸,多页_Python_Html_Web Scraping_Beautifulsoup - Fatal编程技术网

Python 付费墙后的网络强奸,多页

Python 付费墙后的网络强奸,多页,python,html,web-scraping,beautifulsoup,Python,Html,Web Scraping,Beautifulsoup,我试图从一个房地产数据网站上的数据集表中获取一个表。我以前在我所在地区(阿拉伯联合酋长国)的一个房地产上市网站上运行过类似的想法,在那里我会运行类似的脚本。但是,此数据站点要求您通过付费墙才能访问。我有访问权限,但我想在网站上抓取列表,然后点击数千页。我知道在本地保存html时,如何快速浏览一个页面 到目前为止,我的代码如下所示: from bs4 import BeautifulSoup import pandas as pd import requests from requests.aut

我试图从一个房地产数据网站上的数据集表中获取一个表。我以前在我所在地区(阿拉伯联合酋长国)的一个房地产上市网站上运行过类似的想法,在那里我会运行类似的脚本。但是,此数据站点要求您通过付费墙才能访问。我有访问权限,但我想在网站上抓取列表,然后点击数千页。我知道在本地保存html时,如何快速浏览一个页面

到目前为止,我的代码如下所示:

from bs4 import BeautifulSoup
import pandas as pd
import requests
from requests.auth import HTTPBasicAuth

#Login
EMAIL = "EMAIL"
PASSWORD = "PASSWORD"
BASIC_AUTH = HTTPBasicAuth(EMAIL, PASSWORD)
LOGIN_URL = "https://app.datafinder.ae/login"
TABLE_URL = "https://app.datafinder.ae/prices-and-transactions/record-data?d=2020-12&df=2020-03&dt=2021-03&e=1&l=1&ot=1"
response = requests.get(LOGIN_URL,headers={},auth=BASIC_AUTH)

#I want to change html to the response from the table url
soup = BeautifulSoup(response.content, 'html.parser')
header = [th.text for th in soup.table.find_all('th')]
data = []

#Forming Table
for tr in soup.table.find_all('tr'):
    data.append([td.text for td in tr.find_all('td')])
    
#Saving Table
df = pd.DataFrame(data, columns=header)
清单页面的html文件示例是如何转换响应变量,以便bs4能够立即接受它,它给出了:

TypeError: object of type 'Response' has no len()
另外,由于在单击“下一步”时表不会加载新的页面url,因此我如何能够通过访问访问所有页面。按钮html如下(与html文件相同):


我该如何自动翻阅所有页面


提前谢谢

如前所述,您的问题实际上遗漏了许多必要的细节

我只想谈谈提供的细节

以下是处理您的案件的正确方法

import requests
import pandas as pd


def main(url):
    with requests.Session() as req:
        data = {
            "data": {
                "attributes": {
                    "email": "Email",  # Insert Your Email
                    "password": "pass"  # Insert Your Password
                },
                "type": "user_login"
            }
        }
        req.post(url, data=data)
        params = {
            "d": "2020-12",
            "df": "2020-03",
            "dt": "2021-03",
            "e": "1",
            "l": "1",
            "ot": "1"
        }
        r = req.get(
            'https://app.datafinder.ae/prices-and-transactions/record-data', params=params)
        df = pd.read_html(r.content)
        print(df)


main('https://app.datafinder.ae/api/v1/user/login')
在这里,我们维护相同的会话,并将HTML表读入dataframe

但关于以下几点:

另外,由于在单击“下一步”时表不会加载新的页面url,因此我如何能够通过访问访问所有页面。按钮html如下(与html文件相同):

我会将其翻译为(单击“下一步”,页面url不会更改)

这意味着您正在处理
JavaScript
内容,一旦页面加载,这些内容就会动态加载

这就把我们带到了另一个问题上,您需要找出数据的呈现位置,或者您必须使用
selenium
或任何其他可以呈现HTML的库,因为
请求
无法为您呈现HTML


话虽如此,您需要检查以将问题限制在特定目标。

尝试:
soup=BeautifulSoup(response.content,'html.parser')
并用open移除
(..
部分您的问题缺少很多细节。请将您的问题整理出来,以便我们理解。
1
。您使用的是
Basic AUTH
,在这里没有任何用处。
2。
您试图使用错误的url登录。
3。
您甚至没有使用同一个会话来维护登录权限过程。
4。
response
变量只包含响应状态代码!我投票关闭该问题,因为它是一个转储问题,不针对特定问题。@aԋҽԃaъєιcαη我理解您的沮丧,忽略所有登录和
基本验证问题(我使用了一个不同的url来测试登录方法),你能指出如何更改页面吗?@MartinEvans当我尝试时,它给出了一个错误
[Errno 36]文件名太长:b'…
import requests
import pandas as pd


def main(url):
    with requests.Session() as req:
        data = {
            "data": {
                "attributes": {
                    "email": "Email",  # Insert Your Email
                    "password": "pass"  # Insert Your Password
                },
                "type": "user_login"
            }
        }
        req.post(url, data=data)
        params = {
            "d": "2020-12",
            "df": "2020-03",
            "dt": "2021-03",
            "e": "1",
            "l": "1",
            "ot": "1"
        }
        r = req.get(
            'https://app.datafinder.ae/prices-and-transactions/record-data', params=params)
        df = pd.read_html(r.content)
        print(df)


main('https://app.datafinder.ae/api/v1/user/login')