【问题标题】:How to webscrape this website如何对这个网站进行网页抓取
【发布时间】:2012-12-16 22:51:01
【问题描述】:

我这里有一个网站

BSE SmallCap

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

显示 1 - 100 个,共 528 个 >

被看到了。如何访问链接

下一步>>

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

【问题讨论】:

  • 如果您正在寻找一个好的答案,您可能想让您的问题更具体 - 这是谷歌绝对可以帮助解决的问题。另外,请查看 scrapy 或 BeautifulSoup

标签: python ajax web-scraping


【解决方案1】:

你甚至不需要scrapy或类似的东西——没有找到“下一步”链接的链接,因为它实际上是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

【讨论】:

    【解决方案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)

    【讨论】:

    • 你是怎么得到这个完整链接的?
    • @Vinod 这是使用 Google Chrome 的开发者工具(网络标签)实现的
    【解决方案3】:

    使用PyQuery 而不是BeautifulSoupjdotjdot's 进行旋转,我喜欢它用于遍历的jQuery 式符号。它将默认使用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()
    

    【讨论】:

    • 尝试安装 Pyquery。它要求 lxml。
    • @Vinod 你反对安装lxml吗?
    • @beargle 我反对安装lxml;在 Windows 上总是有问题。
    • @jdotjdot 我使用非官方二进制文件here 没有任何问题。两种解析解决方案都有效,我猜只是偏好问题:-)
    • @beargle 我可以将此表作为行列表获取吗?
    猜你喜欢
    • 2021-01-25
    • 1970-01-01
    • 2019-09-08
    • 2019-09-30
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多