【问题标题】:Parsing site in python using beautifulsoup使用beautifulsoup在python中解析站点
【发布时间】:2020-07-15 09:37:07
【问题描述】:

我在为客户解析网站时遇到问题。我想解析https://okchanger.com/exchangers URL。我尝试过使用标头和有效负载发布请求,其中包含网站的一些表单数据。当我在网络选项卡中检查该站点时,有对数据表的发布请求并获取页面本身。我想获取名称和 URL,但 HTML 源代码似乎没有显示它们(在解析 HTML 并查找元素时,它向我显示了一个空列表)。您能告诉我您将如何处理这个问题吗?提前致谢。

import re
import time
import requests
import pandas as pd
from bs4 import BeautifulSoup as bs


class okchangerScraper:
    def __init__(self, URL):
        self.URL = URL
        self.headers = {
            'accept': 'application/json, text/javascript, */*; q=0.01',
            'accept-encoding': 'gzip, deflate, br',
            'accept-language': 'en-US,en;q=0.9',
            'content-length': '1835',
            'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
            'cookie': '__RequestVerificationToken=N5w7MfY6iyx6ExDA6a7kFlKD6rSeYuYE-ExXkw_hOAIK5TpeSb6YUgSPMWWEypMzYNjVELCxA41W7XE0oTJtlLa4TJNIMmsvya8CTCHRkxM1',
            'origin': 'https://www.okchanger.com',
            'referer': 'https://www.okchanger.com/exchangers',
            'sec-fetch-dest': 'empty',
            'sec-fetch-mode': 'cors',
            'sec-fetch-site': 'same-origin',
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',
            'x-requested-with': 'XMLHttpRequest'
        }

    def scrape_this_page(self, page):
        with requests.session() as s:
            s.headers = self.headers

            payload = {
                'draw': '2',
                'columns[0][data]': 'Logo',
                'columns[0][name]': None,
                'columns[0][searchable]': 'true',
                'columns[0][orderable]': 'false',
                'columns[0][search][value]': None,
                'columns[0][search][regex]': 'false',
                'columns[1][data]': 'Name',
                'columns[1][name]': None,
                'columns[1][searchable]': 'true',
                'columns[1][orderable]': 'true',
                'columns[1][search][value]': None,
                'columns[1][search][regex]': 'false',
                'columns[2][data]': 'ReserveUSD',
                'columns[2][name]': None,
                'columns[2][searchable]': 'true',
                'columns[2][orderable]': 'true',
                'columns[2][search][value]': None,
                'columns[2][search][regex]': 'false',
                'columns[3][data]': 'Rates',
                'columns[3][name]': None,
                'columns[3][searchable]': 'true',
                'columns[3][orderable]': 'true',
                'columns[3][search][value]': None,
                'columns[3][search][regex]': 'false',
                'columns[4][data]': 'AlexaRank',
                'columns[4][name]': None,
                'columns[4][searchable]': 'true',
                'columns[4][orderable]': 'false',
                'columns[4][search][value]': None,
                'columns[4][search][regex]': 'false',
                'columns[5][data]': 'Popularity',
                'columns[5][name]': None,
                'columns[5][searchable]': 'true',
                'columns[5][orderable]': 'true',
                'columns[5][search][value]': None,
                'columns[5][search][regex]': 'false',
                'columns[6][data]': 'Status',
                'columns[6][name]': None,
                'columns[6][searchable]': 'true',
                'columns[6][orderable]': 'true',
                'columns[6][search][value]': None,
                'columns[6][search][regex]': 'false',
                'columns[7][data]': 'PositiveReviews',
                'columns[7][name]': None,
                'columns[7][searchable]': 'true',
                'columns[7][orderable]': 'true',
                'columns[7][search][value]': None,
                'columns[7][search][regex]': 'false',
                'order[0][column]': '5',
                'order[0][dir]': 'desc',
                'start': '0',
                'length': '100',
                'search[value]': None,
                'search[regex]': 'false'
            }

            r = requests.post(self.URL + page + '/data-table',
                              payload, headers=s.headers)
            h = r.status_code
            html = r.text

        soup = bs(html, 'html.parser')
        table = soup.find('tbody')
        rows = table.select('tbody > tr:nth-child(1) > td.nowrap')
        print(h)
        print(len(rows))


if __name__ == "__main__":
    scraper = okchangerScraper('https://www.okchanger.com/')
    scraper.scrape_this_page('exchangers')

【问题讨论】:

  • 请发布您到目前为止所尝试的内容。
  • 是的,对不起。我发布了我拥有的代码。 @Sushanth

标签: python web-scraping beautifulsoup


【解决方案1】:

您在这里收到的是json,而不是html。试试这个:

import json
# ...
content = json.loads(r.text)
print(content)

【讨论】:

    猜你喜欢
    • 2019-04-12
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    • 2021-01-30
    • 2012-12-07
    相关资源
    最近更新 更多