【问题标题】:how to scrape multiple pages from one site如何从一个站点抓取多个页面
【发布时间】:2018-03-05 07:57:01
【问题描述】:

我想从一个站点中删除多个页面。模式如下:

https://www.example.com/S1-3-1.htmlhttps://www.example.com/S1-3-2.htmlhttps://www.example.com/S1-3-3.htmlhttps://www.example.com/S1-3-4.htmlhttps://www.example.com/S1-3-5.html

我尝试了三种方法来抓取所有这些页面一次,但每种方法都只抓取第一页。我在下面显示代码,任何人都可以检查并告诉我问题是什么,将不胜感激。

 ===============method 1====================
    import requests  
    for i in range(5):      # Number of pages plus one 
        url = "https://www.example.com/S1-3-{}.html".format(i)
        r = requests.get(url)
    from bs4 import BeautifulSoup  
    soup = BeautifulSoup(r.text, 'html.parser')  
    results = soup.find_all('div', attrs={'class':'product-item item-template-0 alternative'})
    ===============method 2=============
    import urllib2,sys
    from bs4 import BeautifulSoup
    for numb in ('1', '5'):
        address = ('https://www.example.com/S1-3-' + numb + '.html')
    html = urllib2.urlopen(address).read()
    soup = BeautifulSoup(html,'html.parser')
    results = soup.find_all('div', attrs={'class':'product-item item-template-0 alternative'})
    =============method 3==============
    import requests 
    from bs4 import BeautifulSoup  
    url = 'https://www.example.com/S1-3-1.html'
    for round in range(5):
        res = requests.get(url)
        soup = BeautifulSoup(res.text,'html.parser')
        results = soup.find_all('div', attrs={'class':'product-item item-template-0 alternative'})
        paging = soup.select('div.paging a')
        next_url = 'https://www.example.com/'+paging[-1]['href'] # paging[-1]['href'] is next page button on the page 
        url = next_url

我检查了一些答案并检查了,但这不是循环问题,请检查下图,它只是第一页结果。真的是我烦了好几天 please see photo:only first page results, results picture 2

【问题讨论】:

  • method 1 中,将导入放在顶部并缩进 soup = BeautifulSoup(r.text, 'html.parser') 和后续行以在 for 循环中执行

标签: python scrape


【解决方案1】:

你的缩进有问题。

试试(方法一)

from bs4 import BeautifulSoup 
import requests

for i in range(1, 6):      # Number of pages plus one 
    url = "https://www.example.com/S1-3-{}.html".format(i)
    r = requests.get(url)
    soup = BeautifulSoup(r.text, 'html.parser')  
    results = soup.find_all('div', attrs={'class':'product-item item-template-0 alternative'})

【讨论】:

  • 问题一样,你现在可以查看我在问题内容上显示的图片
  • 你能在问题中而不是图片中发布错误吗?
  • 没有显示错误,运行代码然后检查结果,它只刮第一页。但我们需要刮5页。这就是问题所在。
【解决方案2】:

你的页面分析应该在循环内,像这样,否则只会使用一页:

.......
    for i in range(5):      # Number of pages plus one 
        url = "https://www.example.com/S1-3-{}.html".format(i)
        r = requests.get(url)
        from bs4 import BeautifulSoup  
        soup = BeautifulSoup(r.text, 'html.parser')  
        results = soup.find_all('div', attrs={'class':'product-item item-template-0 alternative'})
........

【讨论】:

    【解决方案3】:

    首先,您必须在循环内引入所有订单,否则,只能与最后一次迭代一起使用。

    第二, 您可以尝试在每次迭代结束时关闭请求会话:

    import requests  
        for i in range(5):      # Number of pages plus one 
        url = "https://www.example.com/S1-3-{}.html".format(i)
        r = requests.get(url)
        from bs4 import BeautifulSoup  
        soup = BeautifulSoup(r.text, 'html.parser')  
        results = soup.find_all('div', attrs={'class':'product-item item-template-0 alternative'})
        r.close()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多