【问题标题】:Python Web Scraping Using Selenium使用 Selenium 进行 Python 网页抓取
【发布时间】:2021-05-08 18:03:39
【问题描述】:

要抓取的网站 https://idaman.kpkt.gov.my/idv5xe/98_eHome/maklumatProjek.cfm?pmju_kod=8898&proj_kod_Fasa=1

要抓取的粗体项目 - 第 1 部分(以下 HTML)

<form onsubmit="return lucee_form_c9u.check();" name="myForm" enctype="multipart/form-data" action="mPPTProjek3.cfm?mn=BPPT" method="post">
    <div align="center" style="background-color: white; border: 1px solid grey;">
        <br />
        <table class="MainContent" width="100%" align="center">
            <tbody>
                <tr style="font-weight: bold;">
                    <td class="column" width="30%">Nama Pemaju</td>
                    <td>
                        :
                        <a style="color: blue;" href="maklumatPemaju.cfm?pmju_Kod=8877">**RAPID UNITY SDN. BHD.**</a>
                        <font color="red">* Klik Untuk Melihat Maklumat</font>
                    </td>
                </tr>
                <tr>
                    <td class="column">Kod Pemaju</td>
                    <td>: **8877<**/td></td>
                </tr>

                <tr>
                    <td class="column">Kod Fasa</td>
                    <td>: **1<**/td></td>
                </tr>

                <tr>
                    <td class="column">Nama Pemajuan</td>
                    <td>: **TAMAN UNITY**</td>
                </tr>
            </tbody>
        </table>
    </div>
</form>

用粗体字刮擦的项目 - 第 2 部分


此代码需要 selenium 驱动程序才能点击链接

  1. &lt;tr align="center" onclick="change3('15536',this)" style="cursor:pointer" bgcolor="DAEEF3" onmouseover="this.bgColor='#FF9900'" onmouseout="this.bgColor='DAEEF3'"&gt;

那么只有“name:myForm”后面的95%才会出现`

  1. &lt;tr align="center" onclick="change3('15536',this)" style="cursor:pointer" bgcolor="DAEEF3" onmouseover="this.bgColor='#FF9900'" onmouseout="this.bgColor='DAEEF3'"&gt;

那么 95% 将更改为其他金额

(以下 HTML)

<fieldset title="Maklumat Pemajuan Projek" style="border: 1px solid grey; font-weight: bold; color: black;">
    <legend>Maklumat Pemajuan Projek</legend>
    <table class="MainContent" width="100%" align="center">
        <thead>
            <tr class="column">
                <th>Bil</th>
                <th>Bil Unit</th>
                <th>
                    Jenis<br />
                    Rumah
                </th>
                <th>
                    Kategori<br />
                    Rumah
                </th>
                <th>Tingkat</th>
                <th>
                    Harga<br />
                    Min (RM)
                </th>
                <th>
                    Harga<br />
                    Max (RM)
                </th>
            </tr>
        </thead>
        <tbody>
            <tr align="center" onclick="change2('15535',this)" style="cursor: pointer;" bgcolor="white" onmouseover="this.bgColor='#FF9900'" onmouseout="this.bgColor='white'">
                <td>**1**</td>
                <td>**2**</td>
                <td align="left">
                    **RUMAH BERKEMBAR**
                </td>
                <td>
                    **HARGA TINGGI**
                </td>
                <td>**1**</td>
                <td align="right">**370,000.00**</td>
                <td align="right">**394,900.00**</td>
            </tr>
            <tr align="center" onclick="change3('15536',this)" style="cursor: pointer;" bgcolor="DAEEF3" onmouseover="this.bgColor='#FF9900'" onmouseout="this.bgColor='DAEEF3'">
                <td>**2**</td>
                <td>**18**</td>
                <td align="left">
                    **RUMAH TERES**
                </td>
                <td>
                    **HARGA TINGGI**
                </td>
                <td>**1**</td>
                <td align="right">**190,000.00**</td>
                <td align="right">**290,550.00**</td>
            </tr>
        </tbody>
    </table>
    <br />
    <input name="rekid3" id="rekid3" type="hidden" value="15535" />
    <div id="pemajuan">
        <script language="JavaScript" type="text/javascript" src="/lucee/formtag-form.cfm"></script>
        <script language="JavaScript" type="text/javascript">
            function _CF_checkmyForm() {
                return lucee_form_czz.check();
            }
        </script>
        <table class="MainContent" width="100%" align="center">
            <tbody>
                <tr>
                    <td class="column" width="30%">Jenis Rumah</td>
                    <td>: RUMAH BERKEMBAR</td>
                </tr>
                <tr>
                    <td class="column">Kategori Rumah</td>
                    <td>: HARGA TINGGI</td>
                </tr>
                <tr>
                    <td class="column">Bil Tingkat</td>
                    <td>: 1</td>
                </tr>
                <tr>
                    <td class="column">Bil Unit</td>
                    <td>: 2</td>
                </tr>
                <tr>
                    <td class="column">Harga Minimum</td>
                    <td>: 370,000.00</td>
                </tr>
                <tr>
                    <td class="column">Harga Maximum</td>
                    <td>: 394,900.00</td>
                </tr>
                <tr>
                    <td class="column">Peratusan Pemajuan</td>
                    <td>: **95%**</td>
                </tr>
            </tbody>
        </table>
        <!-- name:myForm -->
        <script>
            lucee_form_czz = new LuceeForms("myForm", null);
        </script>
    </div>
</fieldset>

下面是代码,相信我,几周后我能写的就是……请帮助我,因为我不知道该怎么做

  1. 然后刮掉第 1 部分
  2. 然后点击第 2 部分中的第一个链接
  3. 然后刮掉第 2 部分
  4. 然后点击第 2 部分中的第二个链接
  5. 刮掉第 2 部分并追加。
from selenium import webdriver
from selenium.webdriver.common.by import By
    
url = "https://idaman.kpkt.gov.my/idv5xe/98_eHome/maklumatProjek.cfm?pmju_kod=8898&proj_kod_Fasa=1"
    
driver = webdriver.Chrome(executable_path='/Users/freddielee/Downloads/chromedriver')

driver.find_element(By.NAME="need help here")

【问题讨论】:

  • 你不能做什么?抓取部分还是点击?
  • 你到底卡在了哪一步?
  • 抓取部分我找不到元素点击也找不到要点击的元素

标签: python selenium selenium-webdriver beautifulsoup


【解决方案1】:

我认为只要使用requestsbeautifulsoup就可以得到你想要的,如下:

import requests
from bs4 import BeautifulSoup

s = requests.Session()

params = {"pmju_Kod" : 8877, "proj_Kod_Fasa" : 1}
r = s.get("https://idaman.kpkt.gov.my/idv5xe/98_eHome/maklumatProjek.cfm", params=params)
soup = BeautifulSoup(r.content, "html.parser")

tables = soup.find_all('table', class_="MainContent")

items = []

items.append(tables[0].a.text)

data = [[td.text for td in tr.find_all('td')] for tr in tables[0].find_all('tr')]
items.append(data[1][1].strip(': '))
items.append(data[2][1].strip(': '))
items.append(data[3][1].strip(': '))

data = [[td.text for td in tr.find_all('td')] for tr in tables[3].find_all('tr')]

items.append(data[1][2].strip())
items.append(data[1][3].strip())
items.append(data[1][4])
items.append(data[1][5])
items.append(data[1][6])

items.append(data[2][2].strip())
items.append(data[2][3].strip())
items.append(data[2][4])
items.append(data[2][5])
items.append(data[2][6])

# Pemajuan table
params['rekid'] = 419975503
r2 = s.get('https://idaman.kpkt.gov.my/idv5xe/98_eHome/template/pemajuan.cfm', params=params)
soup2 = BeautifulSoup(r2.content, "html.parser")
table = soup2.find('table', class_="MainContent")
data = [[td.text for td in tr.find_all('td')] for tr in table.find_all('tr')]
items.append(data[-1][1].strip(': '))

print(items)

这将为您提供以下项目:

['RAPID UNITY SDN. BHD.', '8877', '1', 'TAMAN UNITY', 'RUMAH BERKEMBAR', 'HARGA TINGGI', '1', '370,000.00', '394,900.00', 'RUMAH TERES', 'HARGA TINGGI', '1', '190,000.00', '290,550.00', '0%']

【讨论】:

  • 嗨,马丁,感谢您的意见和指导。下面最后一项怎么样
    Peratusan Pemajuan : **95%**
  • 该表是通过第二个请求获得的,我已更新以向您展示如何
  • 嗨,马丁,很抱歉我的问题有些模棱两可。对于第二个请求,“rekid”之后实际上有影子内容(用户代理)。该内容需要单击 table3, Data[1][2] 以显示数据 [1][2] 的附加数据,然后再次单击 table3,, data[2][2] 以显示数据 [2] 的附加数据][2]。其次,如果我在第一个请求下有 10 个参数的列表,我该如何创建一个循环?对于r2,我可以用soup找到rekid吗?
  • 您是否尝试过使用浏览器的网络工具来查看请求。这就是我能够构建这个脚本的方式。观察单击项目时会发生什么。使用它来查看标题和参数。 id 可能在某个地方可以使用
猜你喜欢
相关资源
最近更新 更多
热门标签