1

我这里有一个网站

疯牛病小型股

这里列出了大约 100 家公司。如何使用 Python(或 C#)以编程方式保存接下来的 100 家公司。在这个页面的底部

显示 1 - 100 个,共 528 个 << 上一页 | 下一页>>

可见。如何访问链接

下一页>>

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

4

3 回答 3

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
于 2013-01-02T15:41:04.330 回答
2

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

(我已经删除了 totalPages 方面,因为你需要自己刮这个位)

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

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

于 2013-01-02T15:56:00.040 回答
1

jdotjdot 的答案上使用PyQuery而不是BeautifulSoup,我喜欢它用于遍历的 jQuery 式表示法。它将urllib默认使用或requests用于抓取。

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()
于 2013-01-02T16:56:56.573 回答