如何网页抓这个网站

时间:2013-01-02 15:07:31

标签: python ajax web-scraping

我这里有一个网站

BSE SmallCap

此处列出了约100家公司。 如何使用Python(或C#)以编程方式保存下100家公司。 在本页底部

  

显示1 - 100的528<<上一页|下一步>>

看到了

。如何访问链接

  

下一步>>

以编程方式。此链接被视为基本网址+'#'(http://money.rediff.com/indices/bse/bsesmallcap#)。 如何保存所有1-528公司的详细信息(如单独的网页:1-100,101-200等)。 是否有针对这类任务的特殊定制程序。

3 个答案:

答案 0 :(得分:5)

你甚至不需要scrapy或类似的东西 - 没有找到“Next”链接的链接,因为它实际上是javascript:

javascript:nextPage(document.paging.totalPages.value)

我使用Chrome的开发人员工具来查看它实际发出的请求,结果证明这只是一个简单的未经身份验证的POST请求。您可以通过以下方式获得所需的任何页面:

import requests
r = requests.post('http://money.rediff.com/indices/bse/bsesmallcap',
              data={'currentPageNo': 3, 'RowPerPage': 100})
print r.text

您所要做的就是更改'currentPageNo'参数以获取您要查找的页面。 您可能还可以更改每页的行数,但我没有尝试过。 更新:您不能;我试过了。

在实际保存信息方面,您可以使用BeautifulSoup从每个请求中获取数据并存储或保存。鉴于该表经常在每个页面上都有'dataTable'类,因此很容易找到。所以,鉴于有6页,你最终得到的代码如下:

import requests
from bs4 import BeautifulSoup as BS
for page in range(1, 7):
    r = requests.post('http://money.rediff.com/indices/bse/bsesmallcap',
                      data={'currentPageNo': page, 'RowPerPage': 100})
    soup = BS(r.text)
    table = soup.find(class_='dataTable')
    # Add table information to whatever output you plan to use

答案 1 :(得分:2)

“每个页面”的完整链接是:     http://money.rediff.com/indices/bse/bsesmallcap&cTab=12&sortBy=&sortDesc=&pageType=indices_wise&currentPageNo=1&RowPerPage=100&bTab=12

(我删除了totalPages方面,因为你需要自己刮掉这一点)

一旦知道了页数(来自抓取),就可以增加currentPageNo,直到你拥有所有行。

您可以增加RowsPerPage的数量,但似乎内部限制为200行(即使您将其更改为500行)

答案 2 :(得分:1)

使用jdotjdot's而不是PyQuery来转动BeautifulSoup答案,我喜欢它用于遍历的jQuery-esque表示法。它默认使用urllibrequests进行抓取。

from pyquery import PyQuery as pq
for page in range(1, 3):
    # POST request
    d = pq(url="http://money.rediff.com/indices/bse/bsesmallcap",
           data={"currentPageNo": page, "RowPerPage": 50},
           method="post")
    # jQuery-esque notation for selecting elements
    d("table.dataTable").text()