0
点赞
收藏
分享

微信扫一扫

Python中使用mechanize库抓取网页上的表格数据

在我们日常使用Python中,Mechanize库已经过时,推荐使用更现代的库,比如Requests和BeautifulSoup来抓取网页数据。具体怎么抓取,以下是一个示例代码,演示如何使用Requests和BeautifulSoup库来抓取网页上的表格数据:

Python中使用mechanize库抓取网页上的表格数据_爬虫

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中被广泛应用于网页抓取和数据提取任务。

如果有更多的信息咨询,可以留言讨论。

举报

相关推荐

0 条评论