【问题标题】:Loop URL to scrape using beautiful soup python使用漂亮的汤 python 循环 URL 来抓取
【发布时间】:2013-11-25 01:13:57
【问题描述】:

我正在使用以下代码来抓取网站。我尝试过的以下内容适用于网站中的页面。现在我想抓取几个这样的页面,我正在为其循环 URL,如下所示。

from bs4 import BeautifulSoup
import urllib2
import csv
import re
number = 2500
for i in xrange(2500,7000):
    page = urllib2.urlopen("http://bvet.bytix.com/plus/trainer/default.aspx?id={}".format(i))
    soup = BeautifulSoup(page.read())
    for eachuniversity in soup.findAll('fieldset',{'id':'ctl00_step2'}):
        print re.sub(r'\s+',' ',','.join(eachuniversity.findAll(text=True)).encode('utf-8'))
        print '\n'
        number = number + 1

以下是没有循环的正常代码

from bs4 import BeautifulSoup
import urllib2
import csv
import re
page = urllib2.urlopen("http://bvet.bytix.com/plus/trainer/default.aspx?id=4591")
soup = BeautifulSoup(page.read())
for eachuniversity in soup.findAll('fieldset',{'id':'ctl00_step2'}):
    print re.sub(r'\s+',' ',''.join(eachuniversity.findAll(text=True)).encode('utf-8'))

我将 URL 中的 id 值从 2500 循环到 7000。但是有许多 id 没有任何值。所以没有这样的页面。仅当存在给定 id 的数据时,我如何跳过这些页面并抓取数据。

【问题讨论】:

    标签: python python-2.7 web-scraping beautifulsoup screen-scraping


    【解决方案1】:

    您可以尝试捕获结果 (https://stackoverflow.com/questions/6092992/why-is-it-easier-to-ask-forgiveness-than-permission-in-python-but-not-in-java):

    for i in xrange(2500,7000):
        try:
            page = urllib2.urlopen("http://bvet.bytix.com/plus/trainer/default.aspx?id={}".format(i))
        except:
            continue
        else:
            soup = BeautifulSoup(page.read())
            for eachuniversity in soup.findAll('fieldset',{'id':'ctl00_step2'}):
                print re.sub(r'\s+',' ',','.join(eachuniversity.findAll(text=True)).encode('utf-8'))
                print '\n'
                number = number + 1
    

    或使用(很棒的)库,例如 requests,并在报废前检查

    import requests
    for i in xrange(2500,7000):
        page = requests.get("http://bvet.bytix.com/plus/trainer/default.aspx?id={}".format(i))
        if not page.ok:
            continue
        soup = BeautifulSoup(requests.text)
        for eachuniversity in soup.findAll('fieldset',{'id':'ctl00_step2'}):
            print re.sub(r'\s+',' ',','.join(eachuniversity.findAll(text=True)).encode('utf-8'))
            print '\n'
            number = number + 1
    

    在调用 url 之前,您基本上无法知道具有该 id 的页面是否存在。

    【讨论】:

      【解决方案2】:

      尝试在该站点上查找索引页面,否则,您在尝试访问 URL 之前根本无法判断

      【讨论】:

      • 这和这有什么关系?我有 URL 列表,如果 URL 不退出,我想跳过它。但是很抱歉。我不明白你的意思。
      • 大多数网站都有某种方式循环(分页)现有记录(在您的情况下为 id)或其他方式到达/搜索,否则,他们的用户将无法访问此页面......大多数蜘蛛/抓取器将使用这些“元”页面来覆盖整个集合,第一步将在索引页面上运行,下一步将刮掉它指向的页面,检查像 scrapy.org 这样的项目甚至可能使用它:) 抱歉,如果我没有按照你的意图...
      • 是的。我明白。但我不认为这里的情况是一样的。因为我可以访问该 ID 的任何特定 URL,我猜。
      • 我知道你这样做 :) 我只是说你不应该在所有 id 上盲目循环运行,就像该站点的用户不会这样运行一样,让你的蜘蛛像用户一样使用该站点,让它像潜在用户一样浏览那些页面,调查网站结构,寻找分页/浏览页面
      • SO 有时很有趣,上面的答案建议在网站上点击几千个 404,IMO 至少有 10 个不同的原因导致这很糟糕
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 2018-10-19
      相关资源
      最近更新 更多