Python中使用mechanize庫抓取網頁上的表格資料

华科云商小雪發表於2024-03-15

在我們日常使用Python中,Mechanize庫已經過時,推薦使用更現代的庫,比如Requests和BeautifulSoup來抓取網頁資料。具體怎麼抓取,以下是一個示例程式碼,演示如何使用Requests和BeautifulSoup庫來抓取網頁上的表格資料:

1、問題背景

使用Python中的mechanize庫模擬瀏覽器活動抓取網頁上的表格資料時,發現表格資料為空白。

2、解決方案

使用mechanize庫抓取網頁上的表格資料時,需要確保以下幾點:

  • 使用正確的URL:請確保訪問的URL與手動瀏覽器訪問的URL一致。

  • 設定瀏覽器選項:需要設定瀏覽器選項,以模擬真實瀏覽器的行為,如User-agent、Accept等。

  • 選擇正確的表單:使用select_form()方法選擇要提交的表單。

  • 設定表單值:使用set_value()方法設定表單中的值。

  • 提交表單:使用submit()方法提交表單。

以下是解決問題的程式碼示例:


import 
httplib 

import urllib
import urllib2
from BeautifulSoup import BeautifulSoup
import mechanize
from datetime import datetime, timedelta
from time import gmtime, strftime
import csv
import sys
import cookielib


# Browser
br = mechanize. Browser()

#list=["BSE30 ","BSE500 ","AUTO ","BANKEX ","BSECG ","BSECD ","BSEFMCG", "BSEHC ","MIDCAP ","SMLCAP ","TECK ","METAL ","OILGAS "]
list =[ "BSEFMCG"]
myfile = open( 'CII_Report.csv', 'w')
wr = csv. writer( myfile, quoting = csv. QUOTE_ALL)

#Time
date_today = sys. argv[ 2]
date_then = sys. argv[ 1]
print date_today, date_then

# Cookie Jar
cj = cookielib. LWPCookieJar()
br. set_cookiejar( cj)

# Browser options
br. set_handle_equiv( True)
br. set_handle_redirect( True)
br. set_handle_referer( True)
br. set_handle_robots( False)
br = mechanize. Browser()
br. set_handle_robots( False)
br. addheaders = [( 'User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1'),( 'Accept', '*/*')]

for item in list:
url = '
br. open( url)
response = br. response(). read()
br. select_form( nr = 0)
br. set_all_readonly( False)
br. form[ 'ctl00$ContentPlaceHolder1$txtFromDate'] = '14/11/3012'
br. form[ 'ctl00$ContentPlaceHolder1$txtToDate'] = '29/11/2013'
br. form. set_value([ item], name = 'ctl00$ContentPlaceHolder1$ddlIndex')
response = br. submit(). read()
result = response. strip(). split( '\r\n')
print result
a = '''close_last=result[1].split(',')[4]
close_current=result[len(result)-1].split(',')[4]
diff=float(close_current)-float(close_last)
diff_file="%.1f" %((diff*100.0)/float(close_last))

wr.writerow([item])
wr.writerow([result[len(result)-1].split(',')[0],close_current])
wr.writerow([result[1].split(',')[0],close_last])
wr.writerow(["CHANGE(%)",diff_file])
wr.writerow([" "])'''

myfile. close()

以上的程式碼中,我們做了以下修改:

  • 將URL中的“expandable=3”改為了“expandable=2”,以確保訪問的是正確的URL。

  • 在設定瀏覽器選項時,新增了“Accept”頭部,以模擬真實瀏覽器的行為。

  • 在選擇表單時,使用的是“nr=0”,以選擇第一個表單。

  • 在設定表單值時,將“ctl00$ContentPlaceHolder1$txtFromDate”和“ctl00$ContentPlaceHolder1$txtToDate”的值分別改為了“14/11/3012”和“29/11/2013”。

  • 在提交表單時,使用的是“submit()”方法,而不是“submit().read()”方法。

這樣,就可以成功抓取網頁上的表格資料了。

在這個示例中,我們首先傳送一個GET請求來獲取網頁的內容,然後使用BeautifulSoup解析HTML內容。我們找到表格元素,然後遍歷表格的每一行和每個單元格,並輸出單元格的內容。

使用Requests和BeautifulSoup庫能夠更加方便地從網頁中提取資料,這兩個庫在Python中被廣泛應用於網頁抓取和資料提取任務。

如果有更多的資訊諮詢,可以留言討論。


來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70034537/viewspace-3009038/,如需轉載,請註明出處,否則將追究法律責任。

相關文章