在我们日常使用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 = 'http://www.bseindia.com/indices/IndexArchiveData.aspx?expandable=3'
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中被广泛应用于网页抓取和数据提取任务。
如果有更多的信息咨询,可以留言讨论。