【问题标题】:Missing data when scraping website using loop使用循环抓取网站时丢失数据
【发布时间】:2015-11-15 11:00:33
【问题描述】:

初学者在这里尝试做一个简单的网站抓取。我想从搜索结果的多个页面中提取项目属性。我可以这样做,但我的问题是每页末尾的项目似乎丢失了。

这是我的循环/计数器的简单错误吗?下面的示例代码应该只是打印 x 作为第 x 个搜索结果。

import requests
from bs4 import BeautifulSoup
import xlwt

headers = {'user-agent': 'Mozilla/5.0'}
pagelimit = 60 #number of results on page
startoffset = 0 #starting offset  (no. of items


def extract(soup,count):
    x = count
    for div in soup.findAll("div", "result-item standard"):
        print(x)
        x = x+1

offset = startoffset
count = 1
for i in range(0,10):
    url = "http://www.carsales.com.au/cars/results?offset=" + \
    str(offset) + \
    "&q=%28Service%3D%5BCarsales%5D%26%28%28SiloType%3D%5BDealer%20" + \
    "used%20cars%5D%7CSiloType%3D%5BDemo%20and%20near%20new%" + \
    "20cars%5D%29%7CSiloType%3D%5BPrivate%20seller%20cars%5D%29%29" + \
    "&sortby=~Price&limit=" + \
    str(pagelimit) + "&cpw=1"

    r = requests.get(url, headers)
    soup = BeautifulSoup(r.text, "html.parser")
    extract(soup,count)

    offset = str(i*pagelimit+int(startoffset))
    count = count + pagelimit

【问题讨论】:

    标签: python loops screen-scraping


    【解决方案1】:

    您的代码做了两个可能导致结果缺失的假设

    第一个假设是每个页面都返回最大数量的结果 (pagelimit) - 最后一页不太可能。您应该让 extract 方法返回 x 的最终值:

    def extract(soup,count):
        x = count
        for div in soup.findAll("div", "result-item standard"):
            print(x)
            x = x+1
        return x
    

    那么你应该用类似count = extract(soup,count)的东西替换count = count + pagelimit

    你也可以使用这个数字来设置偏移量。

    第二个假设是至少有 10 页汽车。如果少于 10 页,当您循环超出结果列表的末尾时,您的代码可能会出现异常。

    【讨论】:

    • 感谢您的反馈!但是我发现原因是因为其中混合了 div 类与“结果项标准”不同的搜索结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 2019-08-15
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多